我有一个通用方法,它通过将操作数之一转换为dynamic. 有两种不同的调用:
//array is T[][]
//T is MyClass
array[row][column] != default(T) as dynamic
这有效并调用static bool operator !=(MyClass a, MyClass b)(即使双方都是null)。
令我惊讶的是以下行的行为:
//array, a and b are T[][]
//T is MyClass
array[row][column] += a[line][i] * (b[i][column] as dynamic);
这调用
public static MyClass operator *(MyClass a, object b)和
public static MyClass operator +(MyClass a, object b)
而不是
public static MyClass operator *(MyClass a, MyClass b)和
public static MyClass operator +(MyClass a, MyClass b)。
删除(MyClass, object)运营商原因
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException wurde nicht behandelt.
HResult=-2146233088
Message=Der *-Operator kann nicht auf Operanden vom Typ "[...].MyClass" und "object" angewendet werden.
Source=Anonymously Hosted DynamicMethods Assembly
StackTrace:
bei CallSite.Target(Closure , CallSite , MyClass , Object )
bei System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
bei [...].MatrixMultiply[T](T[][] a, T[][] b) in
[...]
InnerException:
(省略我的)。
为什么?
我可以在不显式调用T Operators.Add<T>(T a, T b)方法而不是运算符的情况下调用正确的运算符吗?
更新
public static T TestMethod<T>(this T a, T b)
{
return (T)(a * (b as dynamic));
}
此方法在单独的程序集中调用(或尝试调用)operator *(T, object),如果相同的方法在主程序集中它正确调用operator *(T, T)。
我用作类型参数的类是internal,当我将它更改为时问题消失了public,所以它似乎取决于类对方法的可见性。
operator *(T, object)即使类不可见,也会成功调用。