【发布时间】:2018-12-15 06:46:53
【问题描述】:
我有一个基类和两个子类,其中一个类有额外的字段。该函数将基类作为参数并在运行时将其转换为子类,但将基类转换为 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 或 A 的实例调用
getValue,因为 A 是 Base 的子类。你不能用 B 来调用它,因为 B 没有基类,除了object。as运算符不会抛出,如果强制转换失败,它将简单地返回 null。由于 B 不是 Base 的子类,因此您的 `base as B` 表达式不会编译 -
另外,如果
getValue接受任何Base,而不仅仅是A实例,如果你只用Base实例调用它,base as A将返回null,所以a.x如果可以编译并且您将其基于Base,则会抛出 -
要么您的示例与您的问题不匹配,要么您忘记从 B 类中的 Base 类继承。
-
public class B : {是无效代码 - 请检查您发布的内容(请参阅 minimal reproducible example 发布代码指南)。假设public class B : Base { ...作为您的帖子声称您不应该收到您声称的错误... -
@AlexeiLevenkov 是的,我已经编辑过了