C#OOPS澄清

时间:2013-06-07 10:29:35

标签: c#

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

3 个答案:

答案 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,因为两行之间可能发生任何事情。然而,在运行时,可以确定它。