为什么List = List ?

为什么以下代码不起作用?

class parent {} class kid:parent {} List parents=new List; 

这对我来说似乎很明显。 这里发生了什么?

C#目前不支持协方差 。

然而,它在.NET 4.0中出现在接口和委托上。

Eric Lippert在他的博客上有一篇非常精彩的关于这个主题的系列文章。 Visual Studio Magazine在最近的一篇文章中也介绍了它。

除了在版本4.0之前的C#中缺乏通用方差支持,List是可变的,因此不能安全地协变。 考虑一下:

 void AddOne(List arg) where T : new() { arg.Add(new T()); } void Whoops() { List contradiction = new List(); AddOne(contradiction); // what should this do? } 

这将尝试将Parent添加到通过List引用引用的List,这是不安全的。 允许数组由运行时协变,但在突变时进行类型检查,如果新元素不能分配给数组的运行时元素类型,则抛出exception。

您正在寻找的function称为协方差。 在版本4.0之前的C#中不支持它,然后仅在接口和委托上支持它。

关于这个主题的一些链接

如果您知道List包含List您可以使用扩展方法来“转换”,(实际上只需将父类型为子类型的孩子并将其返回到列表中。例如:

  public static List Convert(this List input) { return input.OfType().ToList(); } 

我不确定这对你有帮助,但我的价值2美分! 我用它很多。

正如已经指出的那样,C#目前不支持。 在Java中,数组是协变的,它可能会导致一些问题。 考虑一下你的例子,实际的列表应该是一个“kid”列表,这意味着它中的所有对象都应该是“kid”(或“孙子”)。 但是,如果您用于访问列表的引用是“父”列表,那么您可以在列表中插入“父”,这显然不应该发生。