您有以下所示的课程:
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允许我在抛出错误之前达到运行时间?
答案 0 :(得分:3)
有两种类型的演员
我相信在编译时允许(B)new A()
的原因,即使转换被保证失败也是因为(B)someObjectOfTypeA
可以成功,而new A()
肯定是其中一个"对象A"。编译时间检测可能需要额外的基础设施,并且没有被发现是有益的(因为这种转换在运行时立即失败,因此即使是对代码进行最基本的测试也很难错过。)
答案 1 :(得分:1)
在c#中,在运行时用于用户定义的类,这就是编译器不会抛出错误的原因。您可以查看this了解详情。从一个基本类型(字符串)到另一个基本类型(int)的转换称为编译时,因为编译器知道字符串不能被类型转换为int!但在用户定义的类中,有机会! :)