NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

.NET 泛型中的协变与逆变

  • 2008-08-29
  • 本文字数:825 字

    阅读完需:约 3 分钟

当前.NET 语言如 VB 和 C#还不支持泛型的协变(covariance)与逆变(contravariance)。尽管微软中的很多人也在谈论它,但是在不远的将来这还是不太可能出现。对协变与逆变的完整介绍要花很长时间。基于此,请大家参考 Eric Lippert 的关于C#中的协变与逆变的系列文章。为了在VB 中增加协变与逆变的泛型支持,Lucian Wischik 提出了下面的语法。

类型参数可由关键字“In”和“Out”修饰。“In”类型只能作为方法参数。与此类似,“Out”类型只能作为方法的返回类型。

使用Out 类型的一个例子就是IEnumerable(Of T)。如果某函数接受一个IEnumerable(Of Animal) 类型参数,那么我们就可以给它传一个IEnumerable(of Bird)。对于In 类型,一个不太恰当的例子就是顺序。看一下下面的接口:

<pre id="np7-15">Interface IWriter(Of T)<br id="np7-16"></br> Write(value As T)如果你向接受 Writer(Of Animal) 类型参数的函数传一个 IWriter(Of Bird),当然就不对了。该方法可以将 Animal 的任何子类传给 IWriter.Write,但是它只接受 Birds。

如果使用注解,该接口看起来像下面这样:

<pre id="np7-19">Interface IEnumerable(Of Out T)<p>Interface IWriter(Of In T)</p>这是针对 VB 编写的,它也可以用在 C#上。

<pre id="np7-23">interface IEnumerable<out T><p>interface IWriter<in T> </p><br id="ku3p"></br>不幸的是,这种语法并不能直接应用在大多数常见的场景中。比如 IList(Of T),当传给一个向集合中写入的方法时,T 应该是 In 类型。但是当传给一个从集合中读取的方法时,T 应该是 Out 类型。或许这里应该针对 IList 创建一个基类,该类会将接受 T 与返回 T 的方法区分开来。

追溯过去,C#和 VB 都支持数组协变(out/IEnumerable 情况),尽管在逆变的情况下这会导致运行时错误(in/IWriter 情况)。这样做的目的是使 C#更兼容于 Java。大多数人都认为这是一个不好的设计,但是现在却无法改变了。

查看英文原文: Covariance and Contravariance in .NET Generics

2008-08-29 01:311356
用户头像

发布了 88 篇内容, 共 258.6 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

数智化竞价, 企业数智化助力企业实现增收增利

用友BIP

降本增效 数智营销

为什么在财务共享中心建设初期人员不降反增?

用友BIP

财务共享

线上SQL超时场景分析-MySQL超时之间隙锁 | 京东物流技术团队

京东科技开发者

MySQL 数据库 间隙锁 企业号11月PK榜 SQL超时

直播实时数仓基于DataLeap开放平台在发布管控场景的业务实践

字节跳动数据平台

大数据 数据中台 数据安全 数据研发 企业号11月PK榜

如何在本地运行稳定扩散模型

3D建模设计

Stable Diffusion Ai绘图 文本到图像

分布式数据库 GaiaDB-X 与宝兰德应用服务器完成兼容互认

Baidu AICLOUD

分布式数据库

另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国

威廉META

为什么OpenAPI是未来企业数字化转型的决定性因素

华为云PaaS服务小智

云计算 软件开发 华为云

前端安全沙箱技术会不会成为安全的标配?

Onegun

小程序 小程序容器 安全沙箱

PDF Reader Pro 3.0 for mac(pdf阅读器)

展初云

Mac pdf阅读器 PDF Reader Pro

云时代,如何保障运维安全?

尚思卓越

运维 网络安全 堡垒机

SAM + 用于文本到图像修复的稳定扩散

3D建模设计

Stable Diffustion 稳定扩散 文本生成图像

远程运维的定义以及优点详细讲解-行云管家

行云管家

运维 IT运维 远程运维 运维软件 协同运维

手把手教你如何扩展(破解)mybatisplus的sql生成 | 京东云技术团队

京东科技开发者

mybatis sql MyBatisPlus Mybatis-Plus 企业号11月PK榜

火山引擎ByteHouse联合Apache Airflow,让数据管理更加高效

字节跳动数据平台

数据库 大数据 云原生 数仓 企业号11月PK榜

Amazon EC2 Serial Console 现已在其他亚马逊云科技区域推出

亚马逊云科技 (Amazon Web Services)

API cli iam Amazon EC2

Valentina Studio Pro(数据库管理软件)特别版下载mac/win

影影绰绰一往直前

Valentina Studio Pro Valentina Studio Pro下载 Valentina Studio Pro破解

微服务架构下的调试进阶:多环境多服务调试实践与策略

Apifox

架构 微服务 后端 多服务 多环境

百度CTO王海峰:文心一言用户规模已达7000万

飞桨PaddlePaddle

文心一言4.0

源译识 | 译文分享:Elasticsearch诉Amazon商标侵权案

开放原子开源基金会

新方向!文心一言X具身智能,用LLM大模型驱动智能小车

飞桨PaddlePaddle

人工智能 文心一言

stable diffusion为什么能用于文本到图像的生成

3D建模设计

Stable Diffustion 文本到图像 AI 绘图

《央国企数字化产业赋能图谱》编制及申报开启

信通院IOMM数字化转型团队

IOMM 央国企数字化转型 央国企数字化产业赋能图谱

Project Office X for Mac项目管理工具

展初云

Mac 项目管理软件 Project Office X

DataGrip 2023 Mac(多引擎数据库管理工具)

展初云

Mac datagrip 数据库软件

一分钟带你了解光模块

小魏写代码

另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国

鳄鱼视界

【论文解读】针对生成任务的多模态图学习

合合技术团队

人工智能 机器学习 深度学习 论文 多模态学习

一起学Elasticsearch系列-Mapping

Java随想录

Java 大数据 搜索 ES

使用VUE开发有什么好处呢?

Onegun

Vue 前端框架

谈谈压测方案的那点事 | 京东物流技术团队

京东科技开发者

测试 性能测试 压力测试 企业号11月PK榜 大促备战

.NET泛型中的协变与逆变_.NET_Jonathan Allen_InfoQ精选文章