协变与逆变
协变与逆变是.NET 4.O 的新特性,协变和逆变允许数组类型、委托类型和泛型类型参数进行隐式引用转换。 协变保留分配兼容性,逆变与之相反.
一.协变
1.介绍概念之前,先看个例子
/// <summary>
/// 在.NET 4.0之前编译报错
/// </summary>
class Program
{
public abstract class Person { public string Name { get; set; } }
public class Student : Person {}
public class Teacher : Person { }
static void Main()
{
Student student = new Student();
Person person = student;// 这里,基类指向子类的引用,编译通过
IEnumerable<Student> students = null;
IEnumerable<Person> persons = students;//这里 编译报错
}
}
在.NET 4.0 赋值操作是有效的,这是因为IEnumerable<T>的定义发生了变化:查看原文