在阅读Wikipedia上一篇关于协变和逆变的文章时,我遇到了以下粗体句子:
首先考虑数组类型构造函数:从类型
Animal
我们可以创建类型Animal[]
(“动物数组”)。我们是否应该将其视为
- 协变:a
Cat[]
是Animal[]
- 逆变:a
Animal[]
是aCat[]
- 或者都不是(不变的)?
如果我们希望避免类型错误,并且数组同时支持读取和写入元素,那么只有第三种选择是安全的。显然,并不是每一个都
Animal[]
可以被视为 aCat[]
,因为从数组中读取的客户端会期望一个 Cat,但 anAnimal[]
可能包含例如 aDog
。所以逆变规则是不安全的。相反, a
Cat[]
不能被视为 aAnimal[]
。应该始终可以将 aDog
放入 aAnimal[]
中。对于协变数组,这不能保证是安全的,因为后备存储实际上可能是一个猫数组。所以协变规则也不安全——数组构造函数应该是不变的。请注意,这只是可变数组的问题;协变规则对于不可变(只读)数组是安全的。
我理解这个概念;我只是想要一个例子来说明这个在 C# 中“不能保证是安全的”。