如何在C#中将派生类型列表分配给基类型列表?

时间:2013-12-07 03:04:30

标签: c# .net generics

如何实现List<Employee> e = new List<Associate>()?这是错的吗?

class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class Associate : Employee
{
}

class Compute
{
    static void Main()
    {
        List<Employee> e = new List<Associate>();
    }
}

3 个答案:

答案 0 :(得分:4)

想象一下,你有另一个继承自Employee的类,比方说,

class Manager : Employee
{
}

然后,在你的例子中,这可能会发生,

class Compute
{
    static void Main()
    {
        List<Employee> employees = new List<Associate>();
        employees.Add(new Manager()); // Hmmm... what?
    }
}

突然您在Manager列表中有Associate,这违反了类型规则,因为ManagerAssociate没有类关系。这就是List<T>T类型参数声明为不变(而不是List<out T>或协变的原因之一,这样的事情实际上可能会发生)

答案 1 :(得分:3)

您可以将派生类添加到基类列表中。

List<Employee> e= new List<Employee>();
e.Add(new Associate());

答案 2 :(得分:1)

你做不到。这种行为的原因是您仍然可以将基类实例添加到列表应该只是派生类(如BrunoLM提供的blogs.msdn中所述)。

e.Add(new Employee());

以下是避免此问题的可能方法:

  • 您可以拥有基类项列表,因为您可以轻松添加派生类的实例。
  • 您可以在代码中使用var来隐式定义变量的类型(它确实属于List<Associate>
  • 类型
  • 如果您需要将此列表传递给函数 - make参数IEnumerable<Employee>(并且您将能够传递List<Employee>List<Associate>
  • 您可以使用Enumerable.OfType从基类元素列表中过滤派生类的元素。