在将base转换为派生类时,不会在编译时抛出错误

时间:2015-04-26 04:00:38

标签: c# oop casting

您有以下所示的课程:

public class A
{
}

public class B : A
{
}

您将基类强制转换为派生类的类型

A w = (B) new A();    
B x = (B) new A();

这不适用于运行时,因为您无法真正将基类转换为派生类。

但是why is there no compile time error?为什么visual studio允许我在抛出错误之前达到运行时间?

2 个答案:

答案 0 :(得分:3)

有两种类型的演员

  • 一旦明确不允许课程没有共同基础,因此演员没有机会成功。即'串' to' int'。这些强制转换被编译器捕获并导致错误。
  • 有机会成功的演员 - 基于派生有合理的成功机会。编译器允许这样的演员阵容。

我相信在编译时允许(B)new A()的原因,即使转换被保证失败也是因为(B)someObjectOfTypeA可以成功,而new A()肯定是其中一个"对象A"。编译时间检测可能需要额外的基础设施,并且没有被发现是有益的(因为这种转换在运行时立即失败,因此即使是对代码进行最基本的测试也很难错过。)

答案 1 :(得分:1)

在c#中,在运行时用于用户定义的类,这就是编译器不会抛出错误的原因。您可以查看this了解详情。从一个基本类型(字符串)到另一个基本类型(int)的转换称为编译时,因为编译器知道字符串不能被类型转换为int!但在用户定义的类中,有机会! :)