【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

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

关注

评论

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

大数据了解一下

小齐写代码

TDengine 签约福州城建,助力智慧水务数据管理革新!

TDengine

tdengine 时序数据库

怎样利用 AI 大模型,辅助研发管理与效能提升?

思码逸研发效能

AP引擎助力加速生产SQL运行

GreatSQL

数据库 ap greatsql

青否数字人源码助力数字永生让爱延续!

青否数字人

数字人

一文搞懂设计模式—装饰器模式

Java随想录

Java 设计模式

测试人生 | 零基础转行做测试开发,入职3个月后涨薪30%

测吧(北京)科技有限公司

测试

CDN与云计算技术的结合:专业视角下的深度融合

天翼云开发者社区

云计算 CDN 内容分发网络

4个为数据程序员量身打造的PyCharm插件

伤感汤姆布利柏

除了代码行数、工时,我们还有什么更科学的方式度量研发工作量?

思码逸研发效能

【自己实现Sora客户端】颠覆级的王炸般的文生视频工具——Sora

派大星

软件测试简历秀软技能:轻松吸引HR的注意!

测试人

软件测试

知识图谱数据处理流程是什么

悦数图数据库

知识图谱

如何在简历中展示软技能,吸引HR关注

霍格沃兹测试开发学社

查看服务器/IIS日志、log、访问信息基本方法

百度搜索:蓝易云

Linux 运维 windows IIS 云服务器

数字人直播如何变现!

青否数字人

数字人

云数据库实现架构与设计的构想

天翼云开发者社区

数据库 云计算 云数据库

简历秀软技能:轻松吸引HR的注意!

测吧(北京)科技有限公司

测试

软件测试经验分享丨零基础转行做测试开发,入职3个月后涨薪30%

测试人

软件测试

如何实现零基础转行做测试开发,入职3个月后涨薪30%

霍格沃兹测试开发学社

等保测评师工资怎么样?有前途吗?

行云管家

等保 等级保护 等保测评师

2024年漳州本地有正规等保测评机构吗?在哪里?

行云管家

等保 等保测评 等保测评机构 漳州

使用git克隆仓库报错:Warning: Permanently added‘github.com’ to the .....(ssh )

百度搜索:蓝易云

git Linux 运维 报错 云服务器

听 GPT 讲 client-go 源代码 (13)

fliter

香港Web3盛会:HTX Ventures投资经理Gigi Cho确认出席Hack .Summit() 2024!

TechubNews

#Web3

一文带你了解容器探针

华为云开发者联盟

Kubernetes 后端 开发 华为云 华为云开发者联盟

【Ubuntu20.04】安装gcc11 g++11, Ubuntu18.04

百度搜索:蓝易云

Linux ubuntu 运维 gcc11 g++11

Flink ML 的新特性解析与应用

Apache Flink

大数据 实时计算 flink 实战

代码+案例,实战解析BeautifulSoup4

华为云开发者联盟

html 爬虫 开发 华为云 华为云开发者联盟

听 GPT 讲 client-go 源代码 (14)

fliter

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