TryConvert没有';在投射穿过对象时不会被调用
本文关键字:对象 调用 没有 TryConvert | 更新日期: 2023-09-27 18:21:45
我有一个带有已实现TryConvert
方法的DynamicObject
。以下代码运行良好:
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
?
dynamic
关键字,就不会使用动态语言运行时(DLR)。但是动态语言运行时就是所谓的TryConvert
方法。
如果没有DLR,o
只是一个类型为MyDynamicObject
的对象,您正试图将其强制转换为int
。这失败了,因为MyDynamicObject
不是int
。
我完全同意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.