C#4.0中的协方差和协方差都涉及使用派生类而不是基类的能力。in / out关键字是编译器提示,用于指示是否将类型参数用于输入和输出。
协方差
C#4.0中的协方差由
out关键字辅助,这意味着使用
outtype参数的派生类的泛型类型是可以的。因此
IEnumerable<Fruit> fruit = new List<Apple>();
由于
Apple是
Fruit,
List<Apple>可以安全地用作
IEnumerable<Fruit>
逆差
矛盾是
in关键字,它表示输入类型,通常在委托中。原理是相同的,这意味着委托可以接受更多派生类。
public delegate void Func<in T>(T param);
这意味着如果我们有一个
Func<Fruit>,可以将其转换为
Func<Apple>。
Func<Fruit> fruitFunc = (fruit)=>{};Func<Apple> appleFunc = fruitFunc;如果它们基本上是相同的东西,为什么将它们称为协/逆方差?
因为即使原理相同,也可以安全地从派生类型转换为基类,但在输入类型上使用时,我们可以安全地将较少派生类型(
Func<Fruit>)强制转换为更多派生类型(
Func<Apple>),这很有意义,因为任何需要
Fruit,也可以服用
Apple。



