列出从子到父的分配

时间:2010-03-07 15:23:44

标签: c# .net generics list

我正在尝试这样做:

List<Parent> test = new List<Child>();

我班的完整代码是:

class Program
{
    public static void Main(string[] args)
    {
        List<Parent> test = new List<Child>();

        test.Add(new Child());

        test.Add(new AnotherChild());
    }
}

class Parent { }

class Child : Parent { }

class AnotherChild : Parent { }

有人可以告诉我为什么这会给我这个错误:

  

错误2无法将类型'System.Collections.Generic.List'转换为'System.Collections.Generic.List'd:\ personal \ documents \ visual studio 2010 \ Projects \ ConsoleApplication3 \ ConsoleApplication3 \ Program.cs 20 24 ConsoleApplication3

为什么这样做?

Parent[] test = new Child[10];
List<Parent> result = test.ToList();

谢谢:)

- 对:

现在我知道原因:列表编译为List`1,列表编译为List`2。他们没有任何关系。

5 个答案:

答案 0 :(得分:7)

更新,因为List<Parent>List<Child>这两种类型不是co-variant

即使您传入的通用参数Child继承Parent,该关系也不会进入已关闭的List类型。因此,生成的两个List类型不可互换。

.Net 4.0引入了协方差/反方差。但是,您的代码仍无法使用.Net 4.0,因为List类或IList接口都不会更改为共变体。

答案 1 :(得分:3)

您无法执行此操作,因为List<Child>无法分配给List<Parent>,即使Child 可分配给ParentList<T>类型是不变的。

你有什么理由不能使用这样的东西吗?

public static void Main(string[] args)
{
    List<Parent> test = new List<Parent>();

    test.Add(new Child());

    test.Add(new AnotherChild());
}

答案 2 :(得分:1)

使用此

 List<Parent> test = new List<Child>().Cast<Parent>().ToList();

答案 3 :(得分:1)

C#中的泛型是不变的,这意味着泛型类型的不同实例之间没有子类型关系。

从概念上讲,List<Child>不能是List<Parent>的子类型,因为您可以将AnotherChild的实例插入List<Parent>,但不能插入List<Child> }}

答案 4 :(得分:0)

我告诉你这个artice(它对协方差和逆变有很好的描述。): http://blog.t-l-k.com/dot-net/2009/c-sharp-4-covariance-and-contravariance