请为什么行“b [0] = new Child2();”在运行时失败而不是在编译时失败。请不要检查语法,我只是在这里做了
class Base
{}
class Child1 : Base
{}
class Child2 : Base
{}
class Test
{
void Main()
{
Base [] b= new Child1[10];
b[0]= new Child2(); <-- Fails at runtime but not at compile time WHY?
}
}
答案 0 :(得分:5)
new Child1[10];
您刚刚声明了一个类型为Child1
的新数组。
b[0]= new Child2();
现在您正试图将兄弟类放入其中。一个对象数组可以存储该对象,它是子类,但不能存储它的兄弟。
答案 1 :(得分:1)
Ilya Ivanov是对的:可以将一个Child1对象数组转换为Base对象数组。但是你不能为它添加一个Child2,因为这是一个不同的类。
Array covariance意味着如果两个类具有子类 - 超类关系,则它们的数组也具有这种关系。
答案 2 :(得分:0)
您将b定义为child1的数组,然后尝试插入child2。
然而,编译器不能分配给b,因为两行之间可能发生任何事情。然而,在运行时,可以确定它。