写点什么

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

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

关注

评论

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

第11代酷睿处理器出色体验的奥秘原来是这个!

E科讯

区块链的常识之,什么是区块链股份授权证明机制DPoS?

CECBC

区块链 共识机制

一文带你读懂!华为云在ACMUG技术沙龙上都透露了些啥?

华为云开发者联盟

数据库 大数据 数据

SpringCloud Alibaba微服务实战一基础环境准备

AI乔治

Java 架构 微服务 Spring Cloud

大整数算法

落曦

linux开发各种I/O操作简析,以及select、poll、epoll机制的对比

良知犹存

linux开发

基于ELK的日志平台介绍

Rayzh

ELK 日志系统

聊聊在国企当程序员的这三年,这样的生活真的是你想要的吗?

Java架构师迁哥

区块链能修复企业云计算吗?

CECBC

区块链 云计算

年轻人你不讲武德,自己偷着学习!spring Security五套「源码级」笔记哪里来的?我也要!

Java架构追梦

Java 源码 架构 面试 spring security

今年最火的 Golang 云原生开源项目,可能就是它了!

阿里巴巴云原生

开源 Kubernetes 云原生 Go 语言

软件测试流程

测试人生路

软件测试

朋友不讲武德急催我给他Java干货教程,我劝他耗子尾汁并丢给他一份GitHub上标星115k+的Java教程,他看了之后连忙向我道歉!

Java架构之路

Java 程序员 架构 面试 编程语言

从资源管理角度认识K8S

LorraineLiu

Kubernetes 云原生 k8s k8s入门

探秘RocketMQ源码【1】——Producer视角看事务消息

阿里云金融线TAM SRE专家服务团队

开源 RocketMQ 中间件 消息中间件

重点人员管控系统开发,情报研判系统搭建

t13823115967

重点人员管控系统开发 情报研判系统搭建

字节跳动的这份《算法中文手册》火了,完整版PDF开放下载!不少小伙伴靠这份指南成功掌握了算法的核心技能,成功拿到了 BATJ等大厂offer。

Java架构之路

Java 程序员 架构 面试 编程语言

OpenKruise:阿里巴巴 双11 全链路应用的云原生部署基座

阿里巴巴云原生

Kubernetes 运维 云原生 中间件 存储

2020年10月公有云性能评测:盛大云-华东蝉联冠军,腾讯云-北京无缘前三

博睿数据

云计算 腾讯云 ucloud 公有云 评测

面试官都爱问的ThreadLocal

执墨

ThreadLocal 哈希表 弱引用

anyRTC uni-app 跨平台SDK 发布!总有一款适合你!

anyRTC开发者

uni-app 音视频 WebRTC RTC

架构师训练营第 1 期 -week9

习习

数据库:我没有带闪,不讲武德

比伯

Java 编程 程序员 面试 计算机

新思科技:ISO/SAE 21434标准即将发布 你准备好了吗?

InfoQ_434670063458

新思科技 汽车软件安全

想了解物联网应用的自动部署,看这篇就够了

华为云开发者联盟

服务器 华为云 部署

SpringCloud Alibaba微服务实战二 - 服务注册

AI乔治

Java 架构 微服务 Spring Cloud

阿里P8熬夜完成这两份800页Java面试核心知识原理+框架

Java~~~

Java 程序员 面试 编程语言 架构师

对于CRM之于现代化企业的影响以及作用的分析

Learun

敏捷开发 CRM 客户关系管理

DocView 现在支持自定义 Markdown 模版了!

程序员小航

markdown IDEA idea插件 文档生成

区块链司法可信存证,版权维护应用落地

t13823115967

区块链司法可信存证 版权维护应用落地

利用区块链数字化人民币,中国有望从追随者变为新秩序的领导者

CECBC

区块链 数字人民币

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