在下面的代码中:
interface I1 { } class CI1: I1 { } List<CI1> listOfCI1 = new List<CI1>(); IEnumerable<I1> enumerableOfI1 = listOfCI1; //this works IList<I1> listofI1 = listOfCI1; //this does not
我可以将我的“ listOfCI1”分配给IEnumerable<I1>(由于协方差)
IEnumerable<I1>
但是为什么我不能将其分配给IList<I1>?因此,我什至无法执行以下操作:
IList<I1>
List<I1> listOfI12 = listOfCI1;
协方差不应该允许我将派生类型分配给基本类型吗?
简而言之,IList<T>不是协变,而是IEnumerable<T>。这就是为什么
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>-装箱转换不会保留表示形式)。
IEnumerable<int>
IEnumerable<object>