我将从几个前提条件开始,以更好地解释我的问题背景:
数组协变性
前提1.1:值类型的数组不是协变的。int[]不能作为object[]。
前提1.2:引用类型的数组与有效的IEnumerable协变。string[]可以通过IEnumberable。
前提1.3:引用类型的数组与有效的协变数组协变。string[]可以通过object[]。
列表协变性
前提2.1(与1.1相同):值类型的列表不是协变的。List不能通过List。
前提2.2(与1.2相同):引用类型的列表与有效的IEnumerable协变。List可以通过IEnumerable。
前提2.3(与1.3不同):引用类型的列表与有效的协变List不协变。List不能通过List。
我的问题涉及到前提1.3、2.2和2.3。具体来说:
1. 为什么string[]可以作为object[],但List不能作为List?
2. 为什么List可以通过IEnumerable,但不能通过List?
数组协变性
前提1.1:值类型的数组不是协变的。int[]不能作为object[]。
前提1.2:引用类型的数组与有效的IEnumerable协变。string[]可以通过IEnumberable。
前提1.3:引用类型的数组与有效的协变数组协变。string[]可以通过object[]。
列表协变性
前提2.1(与1.1相同):值类型的列表不是协变的。List不能通过List。
前提2.2(与1.2相同):引用类型的列表与有效的IEnumerable协变。List可以通过IEnumerable。
前提2.3(与1.3不同):引用类型的列表与有效的协变List不协变。List不能通过List。
我的问题涉及到前提1.3、2.2和2.3。具体来说:
1. 为什么string[]可以作为object[],但List不能作为List?
2. 为什么List可以通过IEnumerable,但不能通过List?
IEnumerable<T>
不是。只有不可变的集合类应该是协变的。 - Tim Schmelter