1

私はDynamicObject実装されたTryConvertメソッドを持っています。次のコードはうまく機能します。

dynamic d = GetMyDynamic();
int i = (int)d;   // TryConvert is called and returns the proper int value

ただし、d がオブジェクトにキャストされると、実行時に変換が失敗します。

object o = d;
int i = (int)o;  // TryConvert is not called. InvalidCastException thrown

もちろん、(int)(dynamic)o期待どおりに機能します。

何故ですか?そして、それを回避する方法はあり(int)oますTryConvertか?

4

2 に答える 2

2

理由は実に単純です。dynamicキーワードを使用しない場合、動的言語ランタイム (DLR) は使用されません。TryConvertただし、メソッドを呼び出すのは動的言語ランタイムです。

DLR がなければ、キャストしようとしているo型のオブジェクトにすぎません。ではないため、失敗します。MyDynamicObjectintMyDynamicObjectint

于 2013-07-10T13:23:58.060 に答える
2

私はダニエル・ヒルガースに完全に同意します。この理由をよりよく理解するために、オーバーロード演算子の例を考えてみましょう。

public class TestClass
{
    public static explicit operator int(TestClass d)
    {
        return 1;
    }
}

var testClass = new TestClass();
object obj = testClass;
var value = (int)testClass;//No exceptions here, because the CLR knows how to cast TestClass to int.
var i = (int)obj;//Exception here, because the CLR doesn't know how to cast object to int.
于 2013-07-10T13:31:46.310 に答える