【发布时间】:2021-09-26 18:37:03
【问题描述】:
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'类型。”
【问题讨论】:
-
是的,
a属于 (base) 类型A并且不能转换为C,因为C是派生的 i> 来自A。反过来也是可能的:derived 类C的对象c可以转换为 base 类A:C c = new C(); A objA = (A) c; -
同一继承树中引用类型之间的转换是“这个变量说它是
x,但我知道它真的是y,相信我编译器我比你更了解”。它不会将x转换为y,程序员在断言它始终是y(或者更进一步的派生)