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?
}
}
new Child1[10];
你刚刚声明了一个新的数组类型为Child1
。
b[0]= new Child2();
现在您正在尝试将兄弟类放入其中。对象数组可以存储该对象及其子类,但不能存储它的兄弟姐妹。
Ilya Ivanov是正确的:Child1对象数组可以被强制转换为Base对象数组。但是你不能给这个添加Child2,因为这是一个不同的类。
数组协方差意味着如果两个类有子类-超类关系,它们的数组也有这种关系。
您定义b为child1的数组,然后试图插入一个child2。
然而,编译器不知道你给b赋值了什么,因为两行之间可能发生任何事情。但是,在运行时可以确定。