C# OOPS clarification

本文关键字:clarification OOPS | 更新日期: 2023-09-27 18:17:17

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

C# OOPS clarification

new Child1[10];

你刚刚声明了一个新的数组类型为Child1

b[0]= new Child2();

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

Ilya Ivanov是正确的:Child1对象数组可以被强制转换为Base对象数组。但是你不能给这个添加Child2,因为这是一个不同的类。

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

您定义b为child1的数组,然后试图插入一个child2。

然而,编译器不知道你给b赋值了什么,因为两行之间可能发生任何事情。但是,在运行时可以确定。