1

我有DynamicObject一个实现的TryConvert方法。以下代码运行良好:

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

但是,当 d 被强制转换为 object 时,转换在运行时会失败:

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则只是MyDynamicObject您尝试转换为的类型的对象int。那失败了,因为MyDynamicObject不是int.

于 2013-07-10T13:23:58.060 回答
2

我完全同意 Daniel Hilgarth 的观点。为了更好地理解为什么会这样,请考虑重载运算符的示例:

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 回答