一尘不染

关于C#协方差的问题

c#

在下面的代码中:

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>(由于协方差)

但是为什么我不能将其分配给IList<I1>?因此,我什至无法执行以下操作:

List<I1> listOfI12 = listOfCI1;

协方差不应该允许我将派生类型分配给基本类型吗?


阅读 265

收藏
2020-05-19

共1个答案

一尘不染

简而言之,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>-装箱转换不会保留表示形式)。

2020-05-19