我有一个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
?
答案 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.