C# | 泛型委托的协变与逆变

协变 协变:
当类型参数仅用作输出(即返回值)时,可将类型参数标记为 out
这样就允许
1
2
3
Del<Dog> dogMaker = MakeDog; // MakeDog是一个返回Dog匹配委托的方法
Del<Animal> animal = dogMaker;
Console.WriteLine(animal().Leg.ToString());
Del<Animal> 指向了 Del<Dog> 调用代码 animal() 期望返回 Animal , 而其指向的 Del<Dog> 返回了 Dog , Dog 是 Animal 的派生类,接受返回 Dog ,于是可以,调用代码可以自由的操作返回的对象的 Animal 部分 逆变 逆变:
当类型参数仅用作输入(作为方法的参数类型),可将类型参数标记为in
这样就允许
1
2
3
4
5
Del<Animal> animal  =ActOnAnimal; // ActOnAnimal为匹配此委托的方法
Del<Dog> dog = animal;
dog(new Dog());

Del<Dog> 指向了Del<Animal>
Del<Animal> 期望传入 Animal , 现在 Del<Dog> 指向了 Del<Animal>
导致用 Del<Dog> 时传入的是 Dog ,于是又传入了其指向了 Del<Animal> ,
于是传入 Del<Animal> 了一个Animal的派生类Dog
这种在期望传入基类 <Animal> 时允许传入派生对象 <Dog> 的特性叫做逆变 Q&A 补充 参考 感谢帮助!