TryBinaryOperationのドキュメントによると、このメソッドは、二項演算の左側が動的オブジェクトの場合に呼び出されます。
動的オブジェクトから派生したクラスを持っていますが、常にそうであるとは限りません。この例では、オーバーライドへの 3 つの呼び出しが予想されますTryBinaryOperation
が、取得されるのは 2 つだけです。
public class MyDynamic : DynamicObject
{
public override bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result)
{
Console.WriteLine("operation = " + binder.Operation.ToString());
result = arg;
return true;
}
}
class Program
{
static void Main(string[] args)
{
dynamic d = new MyDynamic();
dynamic d1 = d + "add it";
dynamic d2 = d + 1;
dynamic d3 = d >> "shift it";
Console.WriteLine("");
Console.WriteLine(d1);
Console.WriteLine(d2);
Console.WriteLine(d3);
}
}
ただし、最初の呼び出しでは文字列 " DynamicRestProxy.UnitTests.MyDynamicadd it
" が返されます。つまりd.ToString() + "add it"
、動的クラスのバイナリ操作を試みる代わりに、加算演算子によって呼び出されています。さらに、「+」の右側の演算子が int の場合、動的操作が試行されます。
上記のプログラムの出力は次のとおりです (呼び出しd + "add it"
が に到達しないことに注意してTryBinaryOperation
ください)。
operation = Add
operation = RightShift
DynamicRestProxy.UnitTests.MyDynamicadd it
1
shift it
どこにあると思いますか
operation = Add
operation = Add
operation = RightShift
add it
1
shift it
これは正しい予想される動作ですか? もしそうなら、説明するドキュメントはどこかにありますか?
これは VS.NET 2013 と .NET 4.5 を使用しています。