Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

协变逆变

一、 定义

1.协变

和谐的变化,自然的变化//因为 里氏替换原则 父类可以装子类 所以 子类变父类 比如 string 变成 object 感受是和谐的

2.逆变

逆常规的变化,不正常的变件 因为 里氏替换原则 父类可以装子类 但是子类不能装父类 所以 父类变子类 比如 object 变成 string 感受是不和谐的

3.修饰符

协变和逆变是用来修饰泛型的 协变:out 逆变:in

二、作用

注意: 用于在泛型中——修饰泛型字母的 只有泛型接口和泛型委托能使用

  1. 返回值 和 参数 用 out 修饰的泛型 只能作为返回值 用 in 修饰的泛型 只能作为参数

    1
    2
    delegate T TestOut<out T>();
    delegate void TestIn<in T>(T t);

  2. 结合里氏替换原则理解

    1. 协变 父类总是能被子类替换
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Father{}
    class Son{}

    delegate T TestOut<out T>();
    TestOut<Son> oS = ()=>
    {
    return new Son();
    };
    TestOut<Father> oF = os;
    Fater f = oF();//这里实际上 返回的是os里面装的函数 返回的是Son

    2.逆变 父类总是能被子类替换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Father{}
    class Son{}

    delegate void TestIn<in T>(T t);
    TestIn<Father> iF = () =>
    {
    };
    TestIn<Son> iS = iF;
    is(new Son());//实际上 调用的是iF

评论