为什么协变类型参数不允许我写[List <object> lst = new List <string>()]?</string> </object>

时间:2010-08-25 23:54:28

标签: .net-4.0 c#-4.0

如果.Net Framework 4中添加的Covariant类型参数使我能够进行看起来像多态的分配

为什么我可以写

IEnumerable<object> lst = new List<string>();

我不能写

List<object> lst = new List<string>();

2 个答案:

答案 0 :(得分:4)

有两个原因导致它不起作用:

  • IEnumerable<T>是协变的(声明为public interface IEnumerable<out T>),但IList<T>不是。否则你就能做到这样的事情:

    IList<string> listOfStrings = ...
    IList<object> listOfObjects = listOfStrings;
    listOfObjects.Add(42); // would fail at runtime because it is actually a list of strings, not ints
    
  • 协方差和逆变只适用于接口,而不适用于具体类

From MSDN

  

在.NET Framework版本4中,变体类型参数仅限于通用接口和通用委托类型。

答案 1 :(得分:2)

因为List {T}类型是invariant,所以在第二种情况下可以这样做:

List<object> lst = new List<string>();
lst.Add(10);

这是无效的,因为您要将Int32添加到字符串列表中。

IEnumerable {out T}类型是'out'暗示的协变。这意味着无法向其添加项目,只能从中获取项目,这使得第一个语句有效。

然而这是有效的:

List<object> lst = new List<object>();
lst.AddRange(new string[] { "hello" });