【发布时间】:2013-07-11 05:53:37
【问题描述】:
在阅读section 维基百科上一篇关于协变和逆变的文章时,我遇到了以下粗体句子:
首先考虑数组类型构造函数:从类型
Animal我们可以创建类型Animal[](“动物数组”)。我们应该把它当作
- 协变:
Cat[]是Animal[]- 逆变:
Animal[]是Cat[]- 或者两者都不(不变)?
如果我们希望避免类型错误,并且数组同时支持读取和写入元素,那么只有第三种选择是安全的。显然,并不是每个
Animal[]都可以被视为Cat[],因为从数组中读取的客户端会期待一个Cat,但Animal[]可能包含例如Dog。所以逆变规则是不安全的。相反,
Cat[]不能被视为Animal[]。应该始终可以将Dog放入Animal[]。对于协变数组,这不能保证是安全的,因为后备存储实际上可能是一个猫数组。所以协变规则也不安全——数组构造函数应该是不变的。请注意,这只是可变数组的问题;协变规则对于不可变(只读)数组是安全的。
我理解这个概念;我只想要一个示例,说明如何在 C# 中“不能保证是安全的”。
【问题讨论】:
-
我不知道为什么这是作为链接问题的副本而关闭的。一个更相关的q:why-is-array-co-variance-considered-so-horrible
标签: c# .net oop covariance contravariance