首页 > 解决方案 > 无效的转换异常,但构建工作正常

问题描述

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#exceptioncasting

解决方案


这是真的; 您可以随时将 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,所以它们是相关的。我相信开发人员知道他们在做什么,我“会允许的”


推荐阅读