协变
协变: 当类型参数仅用作输出(即返回值)时,可将类型参数标记为 out
这样就允许
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 这样就允许
代码语言:javascript复制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>
的特性叫做逆变
参考
感谢帮助!
- 本文作者: yiyun
- 本文链接: https://moeci.com/posts/2022/01/CSharp-泛型委托的协变与逆变/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!