简而言之,
IList<T>不是协变,而是
IEnumerable<T>。这就是为什么
假设
IList<T>是 协变的。下面的代码显然不是类型安全的…但是您希望错误出现在哪里?
IList<Apple> apples = new List<Apple>();IList<Fruit> fruitBasket = apples;fruitBasket.Add(new Banana()); // Aargh! Added a Banana to a bunch of Apples!Apple apple = apples[0]; // This should be okay, but wouldn't be
对于 很多
方差的细节,请参见埃里克利珀的博客文章系列就可以了,或者看视频我说说从NDC方差。
基本上,方差仅在保证安全的情况下才允许使用(以表示形式保留的方式,这就是为什么您不能转换
IEnumerable<int>成
IEnumerable<object>-装箱转换不会保留表示形式)。



