方法签名中List <t>和IEnumerable <t>之间的差异

时间:2017-10-09 22:01:53

标签: c#

我有2个班级:

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

public class Employee: Person
{
    public string Position { get; set; }
}

我这样用:

var employees = new List<Employee>
        {
            new Employee { FirstName  = "John", LastName = "Doe", Position = "Missed"}
        };

DoSomesing(employees);

如果方法DoSomesing的签名是:

,它可以正常工作
public void DoSomesing(IEnumerable<Person> persons)

但是如果方法DoSomesing的签名是:

,它就不起作用
public void DoSomesing(List<Person> persons)

为什么它适用于第一种情况?

1 个答案:

答案 0 :(得分:3)

IEnumerable<T>covariant,这意味着IEnumerable<Employee>IEnumerable<Person>的子类型,因为EmployeePerson的子类型。相比之下,List<T>不变,因此List<Employee>不是List<Person>的子类型。