写点什么

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

评论

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

多版本并行,测试如何做好质量保障?

老张

质量保障 版本迭代

华为云灾备服务,如何守护云上数据

科技之光

华为云灾备解决方案,助力企业高效构建安全合规云灾备系统

科技之光

打造全栈安全防护体系,华为云等保合规解决方案帮企业30天过等保

科技之光

Hacker 资讯 | 10 月中旬区块链黑客松活动汇总

TinTinLand

创业 defi 区块链、 黑客马拉松 web3、

Rocksdb dynamic-level-bytes测试简单记录

TiDB 社区干货传送门

实践案例 管理与运维

OpenHarmony轻量系统中内核资源主要管理方式

OpenHarmony开发者

OpenHarmony

“程”风破浪的开发者|THREE.JS实现看房自由(VR看房)

知心宝贝

前端 three.js 元宇宙 VR看房 “程”风破浪的开发者

一大波开发者岗位来袭!多家公链、投资机构抛出橄榄枝

TinTinLand

开发者 招聘 程序员、 互联网行业薪资 区块链、

Docker | 部署nginx服务

甜点cc

nginx Docker 10月月更

企业信息安全受威胁?且看华为云灾备如何破解

科技之光

TiCDC 实践:TiDB 到 TiDB 增量数据迁移

TiDB 社区干货传送门

迁移

华为云CDN使能千行百业,业务价值不断凸显!

科技之光

Docker | 容器数据卷详解

甜点cc

Docker 前端 10月月更

新来个技术总监,仅花2小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!

小小怪下士

Java 程序员 多线程

TiDB v6.1.0 及 TiUniManager 在 openEuler 22.03 中的部署踩坑实践

TiDB 社区干货传送门

实践案例 管理与运维 安装 & 部署 应用适配 6.x 实践

华为云,助力企业快速省心过等保

科技之光

git-secret:在 Git 存储库中加密和存储密钥(下)

SEAL安全

git 加密 makefile 密钥管理 10月月更

深度解决企业传统办公痛点,华为云桌面使能云上办公!

科技之光

你的下一个电脑桌面,为何是云桌面?

科技之光

可适配多企业需求,华为云等保合规安全解决方案选择灵活!

科技之光

Java中的抽象类详解

共饮一杯无

Java 抽象类 10月月更

Docker | 镜像浅析,以及制作自己的镜像

甜点cc

Docker tomcat 10月月更

2022年10月《中国数据库行业分析报告》重磅发布!精彩抢先看

墨天轮

数据库 oceanbase Milvus 向量计算 向量数据库

十年磨一剑,华为云数据灾备解决方案为你解决后顾之忧

科技之光

技术强、资源多,华为云等保合规解决方案助力企业快速过等保!

科技之光

万物皆可DAO?一文带你全方位解读DAO类型

One Block Community

区块链 开发者 治理 DAO web3、

华为云,高品质保障企业的等保安全

科技之光

华为云,中小型企业的等保安全专家

科技之光

全球累计用户达300万+,华为云桌面综合体验优秀!

科技之光

及时恢复,华为云灾备数据解决方案让你无忧办公

科技之光

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