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

2022-04-01 17:28:43 浏览数 (1)

协变

协变: 当类型参数仅用作输出(即返回值)时,可将类型参数标记为 out 这样就允许

代码语言:javascript复制
Del<Dog> dogMaker = MakeDog; // MakeDog是一个返回Dog匹配委托的方法
Del<Animal> animal = dogMaker;
Console.WriteLine(animal().Leg.ToString());

Del<Animal> 指向了 Del<Dog>

调用代码 animal() 期望返回 Animal , 而其指向的 Del<Dog> 返回了 Dog , DogAnimal 的派生类,接受返回 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 许可协议。转载请注明出处!

0 人点赞