我想知道为什么在编译时检查C#中的某些强制类型转换,而在其他情况下将责任转交给CLR。像上面一样,两者都是错误的,但是以不同的方式处理。
class Base { } class Derived : Base { } class Other { } static void Main(string[] args) { Derived d = (Derived)new Base(); //Runtime InvalidCastException Derived d = (Derived)new Other(); //Compile-time Cannot convert type... }
在深入 阅读 “ C#”时, 我发现了有关该主题的信息,其中的一位指导老师说: “如果编译器 发现该强制转换 实际上是不可能的,它将触发编译错误-并且在理论上是允许的,但实际上在执行时不正确,CLR将引发异常。”
“理论上”是指通过继承层次结构(对象之间的另一种亲缘关系?)相连还是编译器的内部事务?
编译器仅考虑静态类型。运行时检查动态(运行时)类型。查看您的示例:
Other x = new Other(); Derived d = (Derived)x;
的静态类型x为Other。这与无关,Derived因此强制转换在编译时失败。
x
Other
Derived
Base x = new Base(); Derived d = (Derived)x;
现在的静态类型x为Base。类型的东西Base 可能 具有动态类型Derived,因此这是一个低估。一般来说编译器不能从静态类型的知道x,如果它运行时类型Base,Derived,其他一些子类Base。因此,是否允许强制转换的决定留给运行时。
Base