在通过对象进行转换时不会调用TryConvert

时间:2013-07-10 13:14:19

标签: c# .net dynamic

我有一个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

2 个答案:

答案 0 :(得分:2)

原因实际上非常简单:如果不使用dynamic关键字,则不使用动态语言运行时(DLR)。但动态语言运行时调用TryConvert方法。

如果没有DLR,o只是您尝试转换为MyDynamicObject的{​​{1}}类型的对象。这失败了,因为int不是MyDynamicObject

答案 1 :(得分: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.