C# c中基类到子类的动态转换

C# c中基类到子类的动态转换,c#,exception,casting,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; } } 在运行时将基类强制转换为子类时,它抛出无效的强制

我有一个基类和两个子类,其中一个类有额外的字段。该函数将基类作为参数,并在运行时将其强制转换为子类,但将基类强制转换为类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上失败的原因


这是为什么?

这是非常合乎逻辑的,只有当base的实例是class 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的未来使用,请提供工作代码。使您的助手生活得更轻松。

您可以使用Base或A的实例调用getValue,因为A是Base的子类。不能用B来调用它,因为B除了object之外没有基类。as运算符不抛出,如果强制转换失败,它只会返回null。由于B不是Base的子类,那么您的'Base as B'表达式将不会编译。同样,如果getValue接受任何基,而不仅仅是一个实例,如果您仅使用一个基实例调用它,那么Base as a将返回null,所以a.x会抛出,如果它可以编译,并且你将它基于一个基类,或者你的示例与你的问题不匹配,或者你忘记从B类的基类中继承它。公共类B:{是无效的代码-请检查你发布的内容,参见发布代码的指南。假设公共类B:Base{…正如你的帖子所说,你不应该得到你所说的错误…@AlexeiLevenkov是的,我已经编辑过了