C#:关于C#4中IEnumerable<out T>的理解_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#:关于C#4中IEnumerable<out T>的理解

C#:关于C#4中IEnumerable<out T>的理解

 2014/11/8 21:08:49  周明遥  程序员俱乐部  我要评论(0)
  • 摘要:IEnumerable<outT>这个接口非常常见,它是最基础的泛型集合接口,表示可迭代的项的序列。但是奇怪的是为什么泛型参数要带一个“out”?经过一番资料查阅后,发现此“out”和C#中的“out”类型参数的“out”并非一个意思。IEnumerable<outT>中的out表示这个接口支持“协变性”。何谓“协变性”
  • 标签:C# 理解

IEnumerable<out T>这个接口非常常见,它是最基础的泛型集合接口,表示可迭代的项的序列。

但是奇怪的是为什么泛型参数要带一个“out”?

经过一番资料查阅后,发现此“out”和C#中的“out”类型参数的“out”并非一个意思。

IEnumerable<out T>中的out表示这个接口支持“协变性”。

何谓“协变性”?

 

简单的理解就是“T”可以变化为T的基类型。说了这么多,感觉还是很抽象,用一段代码表示吧。

IEnumerable<int> collection1 = new List<string>();
IEnumerable<object> collection2 = collection1;

 

class="csharp">在C#4.0之前,由于IEnumerable<T>的声明并未包含“out”关键字,所以上面的代码是无法通过编译的,编译器会告知你类型转换失败,因为collection2对应的类型为IEnumerable<object>,而collection1对应的类型为IEnumerable<int>。
其实这个问题并不是多么深刻,因为现在绝大部分C#开发者用的都是C# 5,就会很“理所当然”的觉得collection1可以转化为collection2。我也是,直至查阅资料研究“out”这个关键字才发现之所以可以实现这样转换的原因。



转载声明:本文转载自http://www.zhoumy.cn/?p=16
发表评论
用户名: 匿名