协变逆变
协变:
因为父类可以装子类,所以子类变成父类是协变
比如 string
变成 object
逆变:
父类可以装子类,但子类不能装父类,所以父类变成子类是逆变
比如 object
变成 string
协变和逆变是用来修饰泛型的
协变: out
逆变: in
用于在泛型中修饰泛型字母,只有泛型接口和泛型委托中才能使用
作用
//用out修饰的泛型只能用作返回值
delegate T TestOut<out T>();
//用in修饰的泛型只能用作参数
delegate void TestIn<in T>(T t);
//结合里氏替换原则理解
class Father{}
class Son:Father{}
//协变
TestOut<Son> os =() =>
{return new Son();
};
TestOut<Father> of = os;
//实际返回的是os里面装的Son函数
Father f =of();
//逆变
TestIn<Father> iF= (value)=>
{};
TestIn<Son> iS = iF;
//实际上调用的是iF
iS(new Son());