c# - 无效的转换异常,但构建工作正常
问题描述
public class A
{
public void M1()
{
Console.Write("Print M1 of Class A");
}
}
public class B:A
{
public void M2()
{
Console.Write("Print M2 of Class B");
}
}
public class C : B
{
public void M3()
{
Console.Write("Print M3 of Class C");
}
}
在 main 方法中,我们创建如下对象:-
A objA = new B();
B objB = new C();
A a = new A();
C objC = (C)a; /* this line throws runtime error System.InvalidCastException: 'Unable to cast object of type 'A' to type 'C'.' but build works fine */
objA.M1();
objB.M1();
objB.M2();
objC.M1();
objC.M2();
objC.M3();
我不能先将 C 直接转换为 A。因此尝试创建对象 A 然后显式转换它。智能感知将其视为有效代码并且构建也很好,但在控制台应用程序执行期间,它会引发错误“无法将'A'类型的对象转换为'C'类型”。
解决方案
这是真的; 您可以随时将 C 转换为 A,但唯一可以反过来执行的方法是,如果您将 C 存储在类型为 A 的变量中。编译器允许您这样做,因为 C 来自 A ,因此 A 类型的变量能够保存 C 类型的实例。因此,您可以合法地将 C 存储在 A 中,并且您正在强制将其恢复为 C:
A reallyC = new C();
C gotBack = (C)reallyC;
编译器不会太看重你之前所做的事情;它不会看到这样的代码:
A reallyA = new A();
C willFail = (C)reallyA;
并说“嘿;你已经在 realA 中存储了一个 A,它不能转换为 C”。它只是看到你尝试将真的 A 转换为 C 并认为“它可能是 C,因为 C 是 B 是 A,所以它们是相关的。我相信开发人员知道他们在做什么,我“会允许的”
推荐阅读
- google-cloud-platform - GKE Autopilot 未连接到 Cloud Filestore
- python - 如何根据字典中其他键的值删除键值对?
- bash - 使用 `time` bash 命令时,一种更短的保存文件和格式化测量实时的方法
- ios - 如何摆脱 iOS 15 中出现的表格视图中每个部分上方的额外填充?
- python - Pytorch - 张量的元素 0 不需要 grad 并且没有 grad_fn - 将矩阵相加和相乘作为 NN 步骤参数
- matlab - 移动平均模块为列向量输入返回错误值
- python - value_counts() 基于两列?
- skspritenode - SkSpriteNode 相互堆叠
- spring-boot - Hibernate Elasticsearch 高亮问题
- javascript - 在铯中捕获缩小事件