オペランドの 1 つを にキャストして演算子を呼び出すジェネリック メソッドがありますdynamic
。2 つの異なる呼び出しがあります。
//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)
クラスが表示されていなくても、正常に呼び出されます。