逆变:子类变成父类
协变:父类变成子类
in和out:只能用来修饰委托和接口 类和结构体不行
in:只能当做参数 逆变
out:只能当做返回值,不能当形参 协变
以下都是错误的:
delegate T TestIn<in T>(T t); //不能返回T类型
delegate T TestOut<out T>(T tem); //T类型不能当做形参
作用:
1 out修饰的的泛型类型,只能作为返回值类型,in修饰的泛型类型,只能作为参数类型
2 遵循里式替换原则 用他们来修饰的泛型可以相互装载前提是具有父子关系
举例:
delegate void TestIn<in T>(T t);
delegate T TestOut<out T>();
class Father{}
class Son : Father{}
class Program
{
static void Main(string[] args)
{
//协变 父类总是能被子类替换 不加out关键字下面就报错
TestOut<Son> os = () => { return new Son(); };
TestOut<Father> of = os;
//逆变 子类可以装父类
TestIn<Father> IF = (value) => { };
TestIn<Son> IS = IF;
IS(new Son());
}
}