
协变
协变: 当类型参数仅用作输出(即返回值)时,可将类型参数标记为 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 许可协议。转载请注明出处!


