2

请问为什么行“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?
   }
}
4

3 回答 3

5
new Child1[10];

您刚刚声明了一个新的 type 数组Child1

b[0]= new Child2();

现在你正试图将一个兄弟类放入其中。对象数组可以存储该对象及其子类,但不能存储它的兄弟姐妹。

于 2013-06-07T10:32:41.057 回答
1

Ilya Ivanov 是对的:Child1 对象数组可以转换为 Base 对象数组。但是您不能向其中添加 Child2,因为这是一个不同的类。

数组协方差意味着如果两个类有子类-超类的关系,那么它们的数组也有这种关系。

于 2013-06-07T10:33:04.590 回答
0

您将 b 定义为 child1 的数组,然后尝试插入 child2。

但是,编译器无法分配给 b 的内容,因为两行之间可能发生任何事情。然而,在运行时,它可以被确定。

于 2013-06-07T10:38:50.227 回答