C#OOPS澄清

C#OOPS澄清,c#,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 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?
   }
}
类基
{}
第1类:基本类
{}
第2类:基本类
{}
课堂测试
{
void Main()
{
Base[]b=新子女1[10];
b[0]=新的Child2();
您刚刚声明了一个类型为
Child1
的新数组

b[0]= new Child2();

现在,您正试图将一个同级类放入其中。对象数组可以存储该对象及其子类,但不能存储其同级。

Ilya Ivanov是正确的:Child1对象数组可以强制转换为基对象数组。但不能将Child2添加到该数组中,因为这是另一个类


这意味着,如果两个类具有子类-超类关系,则它们的数组也具有此关系。

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


但是,编译器无法确定您分配给b的是什么,因为这两行之间可能会发生任何事情。但是,在运行时,它是可以确定的。

考虑这篇msdn文章,我相信它的运行时不是编译时,因为在编译时,b的值仍然是它的默认值。同样,它也不知道b是否有一个0元素。OOPS是什么它来自哪里
b[0]= new Child2();