【发布时间】:2013-06-12 09:23:18
【问题描述】:
我将从几个假设开始,以更好地解释我的问题的背景:
数组协方差
假设 1.1
值类型的数组不是协变的。 int[] 不能传递给object[]。
假设 1.2
引用类型的数组与有效的IEnumerable 是协变的。 string[] 可以通过 IEnumerable<object>)。
假设 1.3
引用类型的数组与有效的协变数组是协变的。 string[] 可以传递给object[]。
列表协方差
假设 2.1(与 1.1 相同)
值类型的列表不是协变的。 List<int> 不能传递给 List<object>。
假设 2.2(与 1.2 相同)
引用类型列表与有效的IEnumerable 是协变的。 List<string> 可以通过 IEnumerable<object>)。
假设 2.3(不同于 1.3)
引用类型列表与有效协变 List 不协变。 List<string> 不能通过 List<object>)。
我的问题涉及假设 1.3、2.2 和 2.3。具体来说:
- 为什么
string[]可以传递给object[],而List<string>不能传递给List<object>? - 为什么
List<string>可以传递给IEnumerable<object>而不能传递给List<object>?
【问题讨论】:
-
因为列表是可变的,而数组或
IEnumerable<T>不是。只有不可变的集合类应该是协变的。 -
@TimSchmelter:虽然正确,但该论点也适用于假设 1.3,因此并不能解释为什么 1.3 有效。 ReSharper 在 1.3 的场景中正确警告
标签: c# arrays list ienumerable covariance