一尘不染

编译时和运行时强制转换C#

c#

我想知道为什么在编译时检查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将引发异常。”

“理论上”是指通过继承层次结构(对象之间的另一种亲缘关系?)相连还是编译器的内部事务?


阅读 335

收藏
2020-05-19

共1个答案

一尘不染

  • 可以在编译时检查向上转换-类型系统保证强制转换成功。
  • 向下转换(通常)不能在编译时进行检查,因此始终在运行时进行检查。
  • 无关类型不能相互转换。

编译器仅考虑静态类型。运行时检查动态(运行时)类型。查看您的示例:

Other x = new Other();
Derived d = (Derived)x;

的静态类型xOther。这与无关,Derived因此强制转换在编译时失败。

Base x = new Base();
Derived d = (Derived)x;

现在的静态类型xBase。类型的东西Base 可能
具有动态类型Derived,因此这是一个低估。一般来说编译器不能从静态类型的知道x,如果它运行时类型BaseDerived,其他一些子类Base。因此,是否允许强制转换的决定留给运行时。

2020-05-19