C#显式类型转换编译通过但运行抛出InvalidCastException异常问题咨询
C# 父类实例强制转换为子类实例运行报错原因分析
编译通过的原因
C#编译器对显式强制转换的校验规则仅为:检查源类型和目标类型是否处于同一继承链,存在显式转换的可能性。你代码中C类继承自B类,B类又继承自A类,二者属于同一继承链,因此语法上符合显式转换要求,IntelliSense不会提示错误,编译可以正常完成。
运行报错的原因
CLR在执行类型转换时,会校验对象的实际运行时类型,而非变量的声明类型:
- 你代码中
A a = new A()创建的对象实际类型就是A,仅包含A类自身的成员M1,完全没有B类新增的M2、C类新增的M3等成员,不满足C类型的结构要求。 - 只有当对象的实际运行时类型本身就是目标类型,或者是目标类型的子类时,向下转换(父类转子类)才能成功。比如如下代码就是合法的:
A a = new C(); // 变量a声明类型为A,实际指向C类实例 C objC = (C)a; // 运行正常,不会抛出异常
你代码中的A实例本身不是C类或其子类的实例,因此运行时抛出InvalidCastException异常。
内容的提问来源于stack exchange,提问作者Shalini Raj
相关产品推荐
相关产品推荐

