协变逆变
一、 定义
1.协变
和谐的变化,自然的变化//因为 里氏替换原则 父类可以装子类 所以 子类变父类 比如 string 变成 object 感受是和谐的
2.逆变
逆常规的变化,不正常的变件 因为 里氏替换原则 父类可以装子类 但是子类不能装父类 所以 父类变子类 比如 object 变成 string 感受是不和谐的
3.修饰符
协变和逆变是用来修饰泛型的 协变:out 逆变:in
二、作用
注意: 用于在泛型中——修饰泛型字母的 只有泛型接口和泛型委托能使用
返回值 和 参数 用 out 修饰的泛型 只能作为返回值 用 in 修饰的泛型 只能作为参数
1
2delegate T TestOut<out T>();
delegate void TestIn<in T>(T t);结合里氏替换原则理解
- 协变 父类总是能被子类替换
1
2
3
4
5
6
7
8
9
10class Father{}
class Son{}
delegate T TestOut<out T>();
TestOut<Son> oS = ()=>
{
return new Son();
};
TestOut<Father> oF = os;
Fater f = oF();//这里实际上 返回的是os里面装的函数 返回的是Son2.逆变 父类总是能被子类替换
1
2
3
4
5
6
7
8
9class Father{}
class Son{}
delegate void TestIn<in T>(T t);
TestIn<Father> iF = () =>
{
};
TestIn<Son> iS = iF;
is(new Son());//实际上 调用的是iF