QCon北京开幕在即|与全球 140+ 顶尖工程师共同解构 AI 时代的技术浪潮 了解详情
写点什么

C#的未来:协变返回类型

  • 2020-02-04
  • 本文字数:1028 字

    阅读完需:约 3 分钟

C#的未来:协变返回类型

一个常见的 API 设计问题是无法在重写方法时使用更具体的返回类型。Clone 方法就是一个很好的例子。


public abstract Request Clone();
复制代码


在子类中,你可能会希望像下面这样实现这个方法:


public override FtpRequest Clone() { ... }
复制代码


由于 FtpRequest 是 Request 的子类,从逻辑上讲这是合理的。但在.NET 中你不能这样实现,因为重写必须精确匹配。你也不能通过重写获得一个仅有返回类型不同的新方法。所以通常你会得到一些复杂的东西,比如:


public Request Clone() => OnClone();protected abstract Request OnClone();
复制代码


然后,在子类里:


public new FtpRequest Clone() => (FtpRequest)OnClone();protected override Request OnClone() { ... }
复制代码


提案49在“协变返回类型”中探讨了改变被重写方法返回类型的能力。


在 2017 年最初提出时,这个特性应该是使用一些“编译器魔法”实现的。到 2019 年 10 月,重点已经转向使它成为 CLR 的一等特性。


协变返回类型规范草案中,IL 指令.override 将变成:


重写方法的返回类型必须可以通过标识或隐式引用转换为被重写的基方法的返回类型。


当前的规则是:


重写方法和被重写的基方法应具有相同的返回类型。

属性和索引器

属性和索引器包括在此特性中,但仅当它们是只读的。该特性不会对逆变属性和索引设置器提供匹配支持。

接口

接口上的方法可以使用与子类/基类相同的规则重写基接口上的协变方法。


当类实现接口时,实现方法可以与接口方法协变。


为了进行接口映射,类成员 A 在以下情况下与接口成员 B 匹配:

A 和 B 是方法,A 和 B 的名称和形式参数列表相同,A 的返回类型可以通过一个隐式引用标识转换为 B 的返回类型。


对于隐式实现的接口,这种规则变化可能会导致破坏性更改。这种情况会在子类重新实现基类已经实现的接口时发生。


interface I1 { object M(); }class C1 : I1 { public object M() { return "C1.M"; } }class C2 : C1, I1 { public new string M() { return "C2.M"; } }
复制代码


为了避免破坏性更改,Andy Gocke 对规则做了一个小小的修改:


如果没有其他实现(包括默认实现),我们是否可以更改映射成员的搜索,将具有不同协变返回类型的隐式实现考虑进来?


遗憾的是,这与接口的默认实现不兼容。Neal Gafter 写到:


我看不出这在二进制兼容的情况下是如何工作的。如果发布了带有默认实现的新版本的接口,那么运行时将更改为使用该接口,而不是使用基类的实现?


微软内部正在跟踪对协变返回类型提供必要的运行时支持的优先级。


原文链接:


C# Futures: Covariant Return Types


2020-02-04 09:0011687

评论

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

供应链场景使用ClickHouse最佳实践

京东科技开发者

Code Review:提升代码质量与团队能力的利器

京东科技开发者

深度解析:Shopee商品详情数据接口——助力商家精准营销与数据分析

tbapi

Shopee shopee API shopee商品详情接口 虾皮平台商品详情接口

SMT智能车间MES系统的实施方案

万界星空科技

数字化转型 SMT 生产管理系统 mes 万界星空科技

会话控制定义以及主要目的简单介绍

行云管家

堡垒机 IT运维 会话控制

性能测试场景设计

霍格沃兹测试开发学社

Code Review:提升代码质量与团队能力的利器

京东科技开发者

唯品会商品详情数据接口(标题|主图|销量|价格|店铺)

tbapi

唯品会 唯品会商品数据采集 唯品会API 唯品会商品详情接口

基于软件在环的飞控机建模仿真

DevOps和数字孪生

软件在环

班迪录屏Bandicam使用详解

源字节1号

小程序 开源 后端

【等保知识】等级保护三级系统几年测评一次?法律依据是什么?

行云管家

网络安全 等保 等级保护

华为云应用平台AppStage运维中心,华为全球业务的加速器

华为云开发者联盟

运维 华为云 华为云开发者联盟 企业号2024年7月PK榜

MySQL生产环境迁移至YashanDB数据库深度体验

YashanDB

yashandb 崖山数据库 崖山DB

绿色算力从这片草原开始!

天翼云开发者社区

人工智能 算力

一个故事理解消息队列-上

老张

系统架构 消息队列 基础架构 稳定性保障

直播预告|持续颠覆,永不止步,飞渡科技2024产品发布会即将震撼来袭,敬请期待

新消费日报

AutoMQ 集成 Redpanda Console

AutoMQ

结合LangChain实现网页数据爬取

霍格沃兹测试开发学社

性能测试场景设计

测试人

软件测试

低代码开发MES系统,一周实现数字化

万界星空科技

低代码 数字化转型 低代码平台 mes 万界星空科技

2024可信数据库发展大会:TDengine CEO 陶建辉谈“做难而正确的事情”

TDengine

华为云DTSE助力悦知技术架构升级、打破业务瓶颈

华为云开发者联盟

云计算 云原生 华为云开发者联盟 企业号2024年7月PK榜

【论文速读】| 涟漪下的漩涡:对启用RAG的应用程序的实证研究

云起无垠

如何使用观测云监测 AutoMQ 集群状态

AutoMQ

ChaosMeta for AI:混沌工程让AI稳定性更上一层楼

ChaosMeta

优化京东JD商品详情API使用:提升商品信息获取效率的策略与实践

技术冰糖葫芦

API 编排 API 文档 API 协议

新进展!deepin M1 项目更新至 deepin V23 RC2版本

nn-30

Linux 开源 操作系统 国产操作系统 deepin

微店商品详情数据接口(micro.item_get)丨微店API接口指南

tbapi

微店商品详情接口 微店API 微店商品数据采集

C#的未来:协变返回类型_编程语言_Jonathan Allen_InfoQ精选文章