在C# 4.0中,泛型的协变性被实现得这么好,以至于可以写出下面的代码而不会抛出异常(相对于C# 3.0来说):
List<int> intList = new List<int>();
List<object> objectList = intList;
[示例不可用:请参考Jon Skeet的答案]
最近我参加了一场会议,Jon Skeet给出了一个Generic Variance的很好的概述,但我不确定我是否完全理解它——当涉及到contra和co-variance时,我理解in
和out
关键字的重要性,但我很好奇背后发生了什么。
执行此代码时,CLR会看到什么? 它是否将List<int>
隐式转换为List<object>
,还是说我们现在可以在派生类型和父类型之间进行转换只是List<T>
实现中的内置功能?
出于兴趣,为什么以前的版本没有引入这个特性,主要优点是什么——即实际使用中的好处?
有关Generic Variance的更多信息,请参见此帖子(但问题已过时,需要寻找真正的最新信息)