C#方差问题:将列表<派生>赋值为列表<base>

C#方差问题:将列表<派生>赋值为列表<base>

查看下面的示例(部分摘自MSDN博客):

class Animal { }class Giraffe : Animal { }static void Main(string[] args){
    // Array assignment works, but...
    Animal[] animals = new Giraffe[10]; 

    // implicit...
    List<Animal> animalsList = new List<Giraffe>();

    // ...and explicit casting fails
    List<Animal> animalsList2 = (List<Animal>) new List<Giraffe>();}

这是协方差问题吗?这在未来的C#发行版中会得到支持吗?是否有任何聪明的解决办法(只使用.NET 2.0)?


慕田峪7331174
浏览 581回答 3
3回答

料青山看我应如是

它将在C#4中工作IEnumerable<T>所以你可以:IEnumerable<Animal>&nbsp;animals&nbsp;=&nbsp;new&nbsp;List<Giraffe>();不过List<T>不是协变量投影,因此不能像上面所做的那样分配列表,因为您可以这样做:List<Animal>&nbsp;animals&nbsp;=&nbsp;new&nbsp;List<Giraffe>();animals.Add(new&nbsp;Monkey());显然是无效的。

慕侠2389804

就.而言List<T>恐怕你运气不好。但是,.NET 4.0/C#4.0增加了对协变/反变接口的支持。特别是,IEnumerable<T>现在被定义为IEnumerable<out T>,这意味着类型参数现在是协变.这意味着你可以在C#4.0中做这样的事情.。//&nbsp;implicit&nbsp;castingIEnumerable<Animal>&nbsp;animalsList&nbsp;=&nbsp;new&nbsp;List<Giraffe>(); //&nbsp;explicit&nbsp;castingIEnumerable<Animal>&nbsp;animalsList2&nbsp;=&nbsp;(IEnumerable<Animal>)&nbsp;new&nbsp;List<Giraffe>();注意:数组类型也是协变的(至少在.NET 1.1之后)。我觉得遗憾的是,没有增加方差支持IList<T>和其他类似的泛型接口(甚至泛型类),但是哦,好吧,至少我们有一些东西。
打开App,查看更多内容
随时随地看视频慕课网APP