我有一个基类和两个子类,其中一个类具有其他字段。该函数将基类作为参数,并在运行时将其强制转换为子类,但将基类强制转换为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上失败。
那是为什么?
答案 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,请提供工作代码。使您的助手的生活更加轻松。