我有一个通用方法,它通过将操作数之一转换为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)
即使类不可见,也会成功调用。