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

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.