我有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)
为什么它适用于第一种情况?
答案 0 :(得分:3)
IEnumerable<T>
为covariant,这意味着IEnumerable<Employee>
是IEnumerable<Person>
的子类型,因为Employee
是Person
的子类型。相比之下,List<T>
不变,因此List<Employee>
不是List<Person>
的子类型。