写点什么

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

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

关注

评论

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

中国网约车领域月度观察2023年04月

易观分析

网约车 出行服务

Python自动化办公神器!1行代码实现文件转PDF,支持Word、Excel、PPT、TXT格式

程序员晚枫

Python PDF

MySQL百万数据深度分页优化思路分析

Java你猿哥

Java MySQL 数据库 ssm 优化技术

Trapcode Particular 2023最新版绿色下载安装 mac/win

理理

AE粒子特效插件 Trapcode Particular插件

互联网大厂1000多道 Java面试题及答案整理(2023最新版)

架构师之道

Java 面试

IT知识百科:什么是下一代防火墙和IPS?

wljslmz

防火墙 三周年连更 入侵防御系统

本周日直播,全链路数据治理实践论坛开放报名

阿里云大数据AI技术

大数据 数据治理

用户分享 | Dockquery,一个国产数据库客户端的初体验

BinTools图尔兹

用户体验 国产数据库工具

Java反射详解

timerring

Java

AI都会写脚本了,传统的运维工程师会失业吗? | 社区征文

wljslmz

AI 运维工程师 三周年征文

VMware Fusion Pro 13虚拟机永久激活版,VM13最新激活秘钥

理理

VMware Fusion Pro 13 VM虚拟机破解版 VM密钥

适用于mac/win:DR5插件加强版(ps磨皮滤镜) v5.0中文版

理理

DR5插件加强版 DR5白金版 PS一键磨皮插件 Delicious Retouch 中文

好用的 3D 建模软件:Rhino 7 中文版「最新资源」

理理

Rhino 7 犀牛3D建模软件 Rhino 7中文版 Rhino 7破解 犀牛下载

震撼来袭!最具中国特色的微服务组件:新一代SpringCloud Alibaba

做梦都在改BUG

Java 架构 微服务 Spring Cloud spring cloud alibaba

体验MMGPT本地部署(上)

IT蜗壳-Tango

三周年连更

DxO PureRAW轻松获取纯净无瑕疵raw照片~

真大的脸盆

Mac 图像处理 Mac 软件 Raw图像处理软件 图像编辑工具

sysMaster: 全新1号进程实现方案,秒级自愈,保障系统全天在线

openEuler

Linux rust 操作系统 openEuler init

一路同行,端点科技与海尔集团相伴十年的数字之旅

科技热闻

C++模板和泛型编程详解

小万哥

c++ 程序员 面试 后端 开发

Java 面试八股文合集:涵盖大厂必考的核心知识点

采菊东篱下

Java 程序员 面试

硬核!阿里最新出品架构核心场景实战手册,解决99%的架构问题

Java你猿哥

微服务 架构设计 架构师 架构场景实战 微服务实战

来了!昇腾MindStudio全流程工具链分论坛精彩回顾,助力高效开发和迁移效率提升

科技热闻

k8s+Docker部署方法

Java你猿哥

Java Docker k8s ssm 架构师

鲸鸿动能广告接入如何高效变现流量?

HarmonyOS SDK

HMS Core

一周吃透Java面试八股文(2023最新整理)

Java你猿哥

Java kafka Spring Boot JVM java面试

在SDN技术盛行的时代,网络工程师需要不断学习新技术跟上时代的步伐 | 社区征文

wljslmz

sdn 三周年征文

总有AI想害'朕' 失业,我们该何去何从| 社区征文

穿过生命散发芬芳

ChatGPT 三周年征文

并发编程-ReentrantLook底层设计

Java你猿哥

Java ssm 重入锁 lock锁 底层实现原理

新技术越来越多,作为程序员,我们应该怎么规划职业生涯? | 社区征文

wljslmz

三周年征文

苹果系统热门爆款软件——Downie视频抓取

理理

Mac 视频下载工具 Downie 4许可证 Downie 4 下载

硬核Prompt赏析:HuggingGPT告诉你Prompt可以有多“工程”

无人之路

ChatGPT Prompt

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