在C#中将基类动态转换为子级

时间:2018-12-15 06:46:54

标签: c# exception casting

我有一个基类和两个子类,其中一个类具有其他字段。该函数将基类作为参数,并在运行时将其强制转换为子类,但将基类强制转换为B则产生错误

public class Base {
       int x
  }

public class A :Base {
    A() { x= 5;}
      }
public class B :Base {
   int y ;
   B() { x=5
        y=5;
      }
  }

在运行时将基类强制转换为子级时,会抛出无效的强制转换错误

public int getValue(Base base) {
      A a = base as A //works fine
      B b = base as B // throws invalid cast opertions
      return (a.x + b.x + b.y)
    }

它应该工作,因为两个类都继承自基类,但无法弄清楚为什么它在类B上失败。

那是为什么?

1 个答案:

答案 0 :(得分:1)

这是非常逻辑的,只有当基类的实例是B类时,才可以进行强制转换。我举了一个小例子来更好地解释这一点:

public class BaseClass
  {
    public int x { get; set; }
  }

public class A : BaseClass
{
    public A() { x = 5; }
}
public class B : BaseClass {
    public int y { get; set; }
    public B()
        {
            x = 5; y = 5;
        }
    }
class Program
{
        static void Main(string[] args)
    {
        BaseClass bClase = new BaseClass();
        A a = bClase as A; //a = null
        B b = bClase as B; // c = null

        BaseClass bClase2 = new A();
        A a2 = bClase2 as A; //works fine
        B b2 = bClase2 as B; // b2 = null

        BaseClass bClase3 = new B();
        A a3 = bClase3 as A; // b2 = null
        B b3 = bClase3 as B; //works fine
        //Cast down = ok
        BaseClass bb = bClase3 as BaseClass;

    }
}

PS:为了将来使用stackoverflow,请提供工作代码。使您的助手的生活更加轻松。