我将从几个假设开始,以更好地解释我的问题的背景:
数组协方差
假设 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>
通过 forIEnumerable<object>
但不能 forList<object>
?