协变逆变 多线程 预处理指令
文章目录
1、协变逆变
1、协变逆变概念
协变:
和谐自然的变化
里氏替换原则,父类泛型委托装子类泛型委托
所以子类变父类,比如string变object感受是和谐自然的
逆变:
子类泛型委托装父类泛型委托
父类变子类,比如Object变string,感受是不和谐的
协变和逆变是用来修饰泛型的
协变:out
逆变:in
用于在泛型中修饰泛型字母的
只有泛型接口和泛型委托才能使用
2、作用
1、返回值和参数
用out修饰的泛型类型,只能作为返回值类型
delegate T TestOut<out T>();
interface Test<out T>{
T TestFun();}
用in修饰的泛型类型,只能作为参数类型
delegate void TestIn<in T>(T t);
2、结合里氏替换原则理解
用out和in修饰的泛型委托,可以相互装载(有继承关系的泛型)
//协变 父类总是能被子类替换
TestOut<Son> os = () =>
{
return new Son();
};
//用out修饰,可自动判断返回值有无继承关系
TestOut<Father> of = os;
//看起来调用了父类,实际上代码通过协变,返回的是os里面的函数,返回的是Son
Father f = of();
//逆变 父类总是能被子类替换
TestIn<Father> iF = (value) =>{
};
TestIn<Son> iS = iF;
iS(new Son());
delegate T TestOut<out T>();
delegate void TestIn<in T>(T t);
class Father {
}
c