10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

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

关注

评论

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

低代码实现探索(五)前端组件图形化脚本

零道云-混合式低代码平台

你看到什么是因为要你看到什么

mtfelix

28天写作

中国制造的“天工开物”新篇,如何在云上进化?

脑极体

37 K8S之容器网络模型

穿过生命散发芬芳

k8s 28天写作 12月日更

低代码实现探索(三)后台模型执行设计

零道云-混合式低代码平台

低代码实现探索(四)前端组件核心模型

零道云-混合式低代码平台

1-1聚合架构第二讲:企业架构的认知历程

钰湚—付晓岩

企业架构 软件工程 数字化转型 软件架构 业务架构

1-4聚合架构第五讲:架构方法的进步也不容易

钰湚—付晓岩

企业架构 软件工程 数字化转型 软件架构 业务架构

代码出现异常时,我应该怎么处理?

JavaEdge

签约计划第二季

震惊!大势已来!!区块链的真正价值是什么?

CECBC

区块链等技术将为中欧跨境电商带来革新以及助力城市产业转型升级

CECBC

聚合架构第一讲:开篇啦

钰湚—付晓岩

企业架构 软件工程 数字化转型 软件架构 业务架构

🏆【Alibaba中间件技术系列】「Sentinel技术专题」分布式系统的流量防卫兵的基本介绍(入门源码介绍)

码界西柚

Sentine SpringCloud Alibaba Alibaba技术 限流熔断 12月日更

盘点JavaScript哪些常用的数组对象

你好bk

JavaScript 大前端 数组 html/css 12月日更

数据产品实战-业务洞察

第519区

数据分析 产品经理 数据产品经理 指标体系 数据洞察

青藤:一招制敌!微隔离,让勒索软件不再横行

青藤云安全

普普通通的Route

Time-sun

flutter

单例模式

卢卡多多

28天写作

分布式理论之CAP理论

卢卡多多

CAP理论 12月日更

MySQL探秘(七):InnoDB行锁算法

程序员历小冰

MySQL 28天写作 12月日更

架构实战营模块一作业

novoer

「架构实战营」

定时删除指定目录的过期文件(linux)

liuzhen007

28天写作 12月日更

1-5聚合架构第六讲:聊聊开山祖Zachman框架

钰湚—付晓岩

企业架构 软件工程 数字化转型 软件架构 业务架构

1-6聚合架构第七讲:聊聊togaf的发展历程

钰湚—付晓岩

企业架构 软件工程 数字化转型 软件架构

团建的目的是什么?(7/28)

赵新龙

28天写作

拆分电商系统为微服务

Beyond Ryan

谈谈创业感想

wood

创业 28天写作

数字人民币对人民币国际化的长远影响

CECBC

1-2聚合架构第三讲:从包饺子看工程与架构

钰湚—付晓岩

企业架构 软件工程 数字化转型 软件架构 业务架构

1-3聚合架构第四讲:工程方法的进步也不容易

钰湚—付晓岩

企业架构 软件工程 数字化转型 软件架构 业务架构

通过阅读 SpringCloud 源码 来 理解接口和抽象的区别

悟空聊架构

接口 抽象 28天写作 悟空聊架构 12月日更

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