为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪7331174 2019-06-04 16:20:03
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)?
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

它将在C#4中工作IEnumerable<T>所以你可以:

IEnumerable<Animal> animals = new List<Giraffe>();

不过List<T>不是协变量投影,因此不能像上面所做的那样分配列表,因为您可以这样做:

List<Animal> animals = new List<Giraffe>();animals.Add(new Monkey());

显然是无效的。


查看完整回答
反对 回复 2019-06-04
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

就.而言List<T>恐怕你运气不好。但是,.NET 4.0/C#4.0增加了对协变/反变接口的支持。特别是,IEnumerable<T>现在被定义为IEnumerable<out T>,这意味着类型参数现在是协变.

这意味着你可以在C#4.0中做这样的事情.。

// implicit castingIEnumerable<Animal> animalsList = new List<Giraffe>();
// explicit castingIEnumerable<Animal> animalsList2 = (IEnumerable<Animal>) new List<Giraffe>();

注意:数组类型也是协变的(至少在.NET 1.1之后)。

我觉得遗憾的是,没有增加方差支持IList<T>和其他类似的泛型接口(甚至泛型类),但是哦,好吧,至少我们有一些东西。


查看完整回答
反对 回复 2019-06-04
  • 3 回答
  • 0 关注
  • 580 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信