我有一个由铸造操作数的一个电话运营商的通用方法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)
被成功调用,即使这个类是不可见的。