写点什么

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:0011943

评论

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

以Zookeeper为例 浅谈脑裂与奇数节点问题

数新网络官方账号

zookeeper

火山引擎云搜索服务通过信通院向量数据库可信认证

字节跳动云原生计算

云搜索

云仿真技术的定义、云仿真平台特点

3DCAT实时渲染

实时渲染 云仿真 3D实时云渲染 云3D渲染 仿真云平台

找国内API,用哪家API平台?

幂简集成

API

使用观测云监控观测 AutoMQ 最佳实践

观测云

监控 AutoMQ

AI与心理疗愈:探索心大陆的七大应用领域

心大陆多智能体

智能体 AI大模型 心理健康 数字心理

革新工业运维:TDengine 助力双合电气智能化管理更上一层楼

TDengine

这2个办公实用技巧,让PPT文件保存不再困难!

彭宏豪95

职场 PPT 办公软件 效率软件 AI生成PPT

Yalla、WePlay、YoYo、chamet、MatchPub、Mico、Poppo live--跨越文化差异,畅享全球交流:海外语聊APP的技术挑战

山东布谷科技胡月

语音直播源码 海外社交APP 语聊APP源码 语音聊天平台 交友平台定制

SPSS平方符号如何输入,SPSS平方如何计算 spss数据分析怎么用

阿拉灯神丁

统计学 IBM SPSS Statistics中文 IBM SPSS Statistics下载 spss统计软件 #数据

2024火山引擎AI创新巡展:五城联动,解锁AI落地新密码

新消费日报

Spark内核的设计原理

数新网络官方账号

spark Spark 源码

以工业互联网为支撑 低代码推动数字技术赋能新型工业化

不在线第一只蜗牛

低代码 数字化 工业互联网 制造业

年中工作汇报必备的3个PPT网站推荐,办公效率直线上升!

彭宏豪95

人工智能 PPT 办公软件 AIGC AI生成PPT

数字揭秘丨AI 和结构优化技术让《星球大战》的帝国军队在恩多战役中转败为胜

Altair RapidMiner

人工智能 机器学习 仿真 altair

天谋科技连续获中国信通院认可,认定为时序数据库领航者厂商

Apache IoTDB

天谋科技连续获中国信通院认可,认定为时序数据库领航者厂商

Apache IoTDB

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