在阅读维基百科关于协变和逆变的文章section时,我遇到了以下加粗的句子:
首先考虑数组类型构造函数:从类型Animal
我们可以得到类型Animal[]
(“动物数组”)。我们应该将其视为- 协变:一个
Cat[]
是一个Animal[]
- 逆变:一个Animal[]
是一个Cat[]
- 还是不变?如果我们希望避免类型错误,并且该数组支持读写元素,则只有第三个选择是安全的。显然,并非每个
Animal[]
都可以被视为Cat[]
,因为客户端从数组中读取时会期望得到猫,但是Animal[]
可能包含例如Dog
。因此,逆变规则不安全。相反,
Cat[]
不能被视为Animal[]
。应该总是能够将Dog
放入Animal[]
中。对于协变数组,无法保证这是安全的,因为后备存储可能实际上是猫的数组。因此,协变规则也不安全 - 数组构造函数应该是不变的。请注意,这仅适用于可变数组;对于不可变(只读)数组,协变规则是安全的。
我理解这个概念,只是想要一个C#中的“无法保证安全”的例子。