C# c中基类到子类的动态转换
我有一个基类和两个子类,其中一个类有额外的字段。该函数将基类作为参数,并在运行时将其强制转换为子类,但将基类强制转换为类B会产生错误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; } } 在运行时将基类强制转换为子类时,它抛出无效的强制
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是的,我已经编辑过了