Qwen3 惊喜上线阿里云百炼,8款模型全开源!点击免费领取 800万 tokens! 了解详情
写点什么

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

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

关注

评论

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

C语言自定义类型 | AI工程化部署

AIWeker

c AI工程化部署

SQL 也能搞复杂时序查询?-使用 SQL 在 GreptimeDB 上做 Range 查询

Greptime 格睿科技

数据库 sql 时序数据库

苹果Macos好玩的经典游戏推荐!

Rose

mac游戏 苹果mac游戏 Mac游戏推荐

Wireshark中的ARP协议包分析

小魏写代码

每日一题:LeetCode-41. 缺失的第一个正数

Geek_4z9ami

面试 算法 数组 LeetCode 哈希表

高精度时序分析工具PP-TSv2!一站式解决电力负荷预测、设备异常检测等多场景任务

飞桨PaddlePaddle

人工智能 开发者 开发工具 技术干货 时序分析工具

时间复杂度为 O(n^2) 的排序算法 | 京东物流技术团队

京东科技开发者

算法 排序算法 O(n^2)

哈工大副校长刘挺访问度小满 推进人工智能等方面技术合作

科技热闻

石磊:以人为本,精细运营 ,企业招聘管理的下半场

用友BIP

智能招聘

测试用例设计方法六脉神剑——第一剑:入门试招,等价边界初探 | 京东物流技术团队

京东科技开发者

测试 测试用例 测试 单元测试

专家观点∣用未来思考今天,ERP国产化价值替代的“五识”进阶能力

用友BIP

国产化价值替代

拥抱未来:大语言模型解锁平台工程的无限可能

SEAL安全

平台工程 12 月 PK 榜 大语言模型

数据库面试题从浅入深高频必刷「2024版」

王中阳Go

MySQL 数据库 后端 面试题 面经

如何在 Mac 上创造一个纯 Windows 环境

Rose

Parallels Desktop

云起无垠CEO沈凯文博士获评“2023年度技术突破者”奖

云起无垠

代购系统独立站的未来发展前景

Noah

探索 Tokio Runtime丨Fabarta 技术专栏

Fabarta

人工智能 rust 图数据库 rust开发者大会 ​Rust

springboot如何用jar包启动,同时为不同机房设置不同的配置文件 | 京东云技术团队

京东科技开发者

Java spring 后端 spring-boot jar包

企业业务场景如何实现自动化连接?

RestCloud

AppLin 自动化连接

企业服务大模型扎根生产一线,用友BIP为中国智造“再续新篇”!

用友BIP

企业大模型

关于组态图和组态图设计

2D3D前端可视化开发

组态软件 组态 组态图库 组态界面 组态工具

聊点技术|数据爆炸性增长,Bonree ONE存储如何做到稳如泰山

博睿数据

去哪儿“技术债”偿还实践:如何高效、低风险砍掉50%无用代码?

TakinTalks稳定性社区

微软远程管理Microsoft Remote Desktop怎么样?好用吗?

Rose

Mac远程控制软件 microsoft remote desktop mac破解软件下载 微软远程管理

用友电子凭证综合服务平台2.0重磅发布!

用友BIP

电子凭证

TinyVue 组件库助力赛意信息获得工业软件种子奖

OpenTiny社区

开源 前端 组件库

springboot集成activiti工作流实际项目(自定义工作流)

金陵老街

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