协变逆变

协变逆变

协变:

因为父类可以装子类,所以子类变成父类是协变

比如 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());

posted @ 2025-03-14 13:36  cannedmint  阅读(14)  评论(0)    收藏  举报