当前位置: 首页 > news >正文

泛型的协变(Covariance)和逆变(Contravariance)

一、什么是协变和逆变

如果存在一个泛型接口Interface<T>
它的泛型参数的子类型IInterface<Dog>可以安全的转换成泛型父类型的IInterface<Animal>
这个过程就称为协变

如果存在一个泛型接口IInterface<T>
它的泛型参数的父类型IInterface<Animal>可以安全的转换成泛型子类型的IInterface<Dog>
这个过程就成为逆变

我们先明确两个术语:

协变(Covariance):保持类型顺序。如果 DogAnimal 的子类,那么 IEnumerable<Dog> 可以被视为 IEnumerable<Animal>

逆变(Contravariance):反转类型顺序。如果 DogAnimal 的子类,那么 Action<Animal> 可以被视为 Action<Dog>

协变与逆变解决的问题

假设你有如下类层次:

class Animal { }
class Dog : Animal { }

❌ 没有协变/逆变时的问题
在没有协变的情况下,以下代码会编译失败:

List<Dog> dogs = new List<Dog>();// 编译错误!List<Dog> 不能赋值给 List<Animal>
List<Animal> animals = dogs;

因为泛型默认是 不变(Invariant) 的,即 List<Dog>List<Animal> 没有继承关系。
但直觉上,狗的列表“应该是”动物列表的一种。协变就是为了解决这种合理的类型转换需求,同时保证类型安全。

实际应用场景

协变: 你有一个 IReadOnlyList<IDocument>,但实际传入的是 IReadOnlyList<PdfDocument>,协变让它可以接受。
逆变: 你有一个排序器IComparer<object>,它可以用于比较任何对象,包括 stringPerson,所以可以赋值给 IComparer<string>

C# 使用 out 和 in 关键字来声明协变和逆变:

out T:表示 协变(Covariance),T 只能作为方法的返回值(输出)。
in T :表示 逆变(Contravariance),T 只能作为方法的参数(输入)。

http://www.dtcms.com/a/541717.html

相关文章:

  • 个人免费域名注册网站营销型网站建设空间必须是
  • 在线书店网站怎么做网站开发工程师ppt
  • 【JavaEE初阶】网络原理——TCP处理先发后至问题
  • 广州有名的网站建设公司无锡网站建设制作设计
  • 解锁 Playwright 自动化测试:一篇教程入门WebUI自动化测试【入门级】
  • 如何做一个公司网站高校档案馆网站建设
  • wordpress 网站特效找做cad彩拼的网站
  • 多态性:让程序更加灵活与可扩展!
  • 混杂设备驱动
  • 【SpringMVC】Spring MVC 核心全解析:从 MVC 思想到 Web 交互(请求、响应、参数传递全实践)
  • 最专业的手机网站建设磐安建设局网站
  • 做英文行程的网站上海迪士尼乐园官网
  • SAM2学习笔记
  • 基于dcmtk的dicom工具 第十一章 加载dicom文件多帧图数据
  • 建网站多少钱一平方电工证免考拿证
  • 桌面开发,在线%可视化,招聘系统demo,基于python,matplotlib,request,爬虫,数据库无
  • 护照识别接口-高效智能的OCR身份核验新体验-OCR文字识别API
  • 性能测试 | 性能测试工具JMeter直连数据库和逻辑控制器的使用
  • 建站 报价专业网站开发制作公司
  • 手机版网站如何做直接进网站的浏览器
  • 网站建设总结与心得体会颍州网站建设
  • 引力概念中的混乱点:传统物理学与张祥前统一场论对比
  • 通管局报审通关秘籍:网约车平台网络安全防护与保障能力报告
  • 郑州市建设网站wordpress 加斜杠
  • 正规网站建设公司一般要多少钱建设银行面试经验网站
  • [ssh]系统重装后,如何重新设置window免密登录远程linux服务器
  • 网站模板预览与编辑器旅游网站简介
  • 网站建设ppt百度文库注册公司地址可以用家庭地址
  • 学习一下kernel6.12中sugov_iowait_apply的函数逻辑
  • 北京网站开发报价做搜狗网站优化首页软