首先让我们记住这些内容

in —定义逆变 (父类到子类)
out–定义协变 (子类到父类)

开玩笑哈哈,都是成年人了,不至于要背书

我们都知道.Net里或者说在OOP的世界里,可以安全地把子类的引用赋给父类引用,例如:

string str = "string";
object obj = str;

而C#里又有泛型的概念,泛型是对类型系统的进一步抽象,比上面简单的类型高级,把上面的变化体现在泛型的参数上就是我们所说的逆变与协变的概念。通过在泛型参数上使用in或out关键字,可以得到逆变或协变的能力。

一、逆变

在这里插入图片描述

这样定义,只允许T类型在参数内使用允许类型<父类>到类型<子类>的转换

二、协变

在这里插入图片描述
这样定义,只允许T类型在返回值内使用允许类型<子类>到类型<父类>的转换

三、理解一下

out - 能获取猪肉的方法,一定是获取到了动物肉,所以out仅用于返回值,是一种子到父的必然成立,称为协变
in - 能杀动物的方法,一定可以杀猪,所以in仅用于参数,是一种父到子的必然成立,称为逆变