硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

.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:311561
用户头像

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

关注

评论

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

DAPP代币通缩燃烧销毁质押挖矿系统开发(成熟技术)

l8l259l3365

中国平煤神马集团 | 基于融合共享的经营管控多业务(1+2+N)共享中心建设实践

用友BIP

能源 数智化转型 共享中心

Codigger的项目代码检测工具的特性和优势

知者如C

2023年信创云管平台选哪家?咨询电话多少?

行云管家

云计算 云服务 信创 国产化

cad设计绘图 AutoCAD 2024中文最新「支持m芯片」

胖墩儿不胖y

Mac软件 CAD绘图 cad工具

算力百川汇蓝海,商海荡漾绘宏图

鲸品堂

算力 算力网络

代码层面探索前端性能 | 京东云技术团队

京东科技开发者

CSS 性能优化 前端 企业号9月PK榜

用友出席第六届中国企业论坛,分享央国企数智化转型方案

用友BIP

数智化转型

MySQL事务死锁问题排查 | 京东云技术团队

京东科技开发者

MySQL 数据库 事务 死锁 企业号9月PK榜

如何使用API接口获取商品数据,从申请API接口、使用API接口到实际应用,一一讲解

Noah

API 文档 API 开发

软件调研、研发、设计、管理、验收文档(全文档整理)

金陵老街

小程序编译器性能优化之路

百度Geek说

小程序 性能优化 前端 企业号9月PK榜

软件物料清单管理 | 打开“应用软件盲盒”,预警“开源组件风险”

网安云

开源 网络安全 系统安全 开源软件 软件物料清单

Databend 开源周报第112期

Databend

Springboot vs Quarkus

Kevin_913

香港服务器如何帮助企业在线业务提供卓越性能和稳定性

一只扑棱蛾子

香港服务器

JDK安装与配置教程

小齐写代码

Java基础面试题【三】线程(1)

派大星

Java 面试题

Vitess全局唯一ID生成的实现方案 | 京东云技术团队

京东科技开发者

MySQL 数据库 企业号9月PK榜 vitess

中文导航、本地指南一个App搞定,华为手机国庆出境游用Petal Maps就够了!

最新动态

向上管理:三个技巧,教会你如何与上级、老板高效协作

LigaAI

产品经理 技术管理 职场成长 向上管理 企业号9月PK榜

数字化转型与架构-架构设计篇|软件开发框架帮我们做了什么?

数字随行

数字化转型

华为云智能化组装式交付方案 ——金融级PaaS业务洞察及Web3实践的卓越贡献

云计算 软件开发 华为云

高效、透明-企事业数字化的采购管理系统(源程序源代码)

金陵老街

华为云API Explorer重磅推出API编排,开发者0代码高效构建工作流

华为云开发者联盟

软件开发 API 华为云 华为云开发者联盟 企业号9月PK榜

可观测成熟度模型介绍(二)

乘云数字DataBuff

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