50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

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

关注

评论

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

AI时代的信息技术部怎么改革?

FN0

小程序 超级app

Java高手速成 | JSP MVC模式项目案例

TiAmo

mvc java; jsp

【FAQ】申请运动健康服务验证环节常见问题及解答

HarmonyOS SDK

HMS Core

应用可靠性与性能不给力?HarmonyOS HiViewDFX了解一下

HarmonyOS开发者

HarmonyOS

TDengine 荣获 2022 金猿奖“大数据产业最具投资价值企业”“大数据产业创新技术突破”

TDengine

数据库 tdengine 时序数据库

泼辣修图2023官方网页版入口在哪里?

茶色酒

泼辣修图2023

Flomesh Ingress 使用实践(二)TLS 进阶

Flomesh

HTTP ingress Pipy

「钞能力养成指北」前传:开年变富,开发者如何迈出第一步?

LigaAI

敏捷开发 新年计划 复式记账 图论 企业号 2 月 PK 榜

用 NFTScan 的角度解析 Yuga labs NFT 项目系列

NFT Research

NFT BAYC

共铸国云智领未来| 如心未来社区的“幸福密码”

天翼云开发者社区

疫情时代的宠儿:抗生素行业,今后何去何从

前嗅大数据

大数据 数据分析 网络爬虫 抗生素

Apipost如何自定义响应参数?

叶小柒

如何理解DevOps?

老张

DevOps 软件工程

面试官:什么是双亲委派模型?

王磊

java面试

疫情大环境下科技互联网公司开源节流降本增效

laofo

研发效能 降本增效 开源节流

利用 Addax 异构迁移数据到 Databend

Databend

一次JSF上线问题引发的MsgPack深入理解,保证对你有收获

京东科技开发者

测试 序列化 msgpack 核心压缩

开发者变富攻略 | 如何使用开源工具,科学记账?

LigaAI

程序人生 敏捷开发 复式记账 企业号 2 月 PK 榜 Beancount

高效管理,让工作事半功倍

石云升

极客时间 2月月更 技术领导力实战笔记

数字先锋| 枣庄政务云全新升级,居民办事体验upup!

天翼云开发者社区

基于SLO告警(Part 2):为什么使用MWMB方法

Grafana 爱好者

可观测性 Grafana Prometheus SRE SLO

架构杂谈——互联网系统架构演进

小小怪下士

Java 程序员 后端 架构设计

天翼云以10.2%份额位列中国公有云IaaS+PaaS市场第三

天翼云开发者社区

用Apipost进行gRPC调试教程

不想敲代码

微服务 gRPC 接口调试

周鸿祎瞄准中小微客户提供免费SaaS,思路:50万企业×2万年费=100亿补贴

B Impact

时序电路建模基础

timerring

FPGA

安全可信| 首批+先进!天翼全栈混合云一举斩获三项可信云评估

天翼云开发者社区

Apipost全局参数和目录参数怎么用?

不想敲代码

接口文档 apipost API调试

如何合并与拆分 Word 表格中的单元格

Geek_249eec

C# word VB.NET

2023云原生安全值得关注的3个方向

HummerCloud

ebpf 云原生安全 SBOM

跨境SaaS企业“会议营销"实战:立足商机注定平庸,300分客户转不转“MQL"?

B Impact

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