写点什么

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

评论

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

轻松上手,轻量级低代码助力企业数字化转型

天津汇柏科技有限公司

数字化转型 低代码平台

前端调试实践

京东科技开发者

数据湖系列之四 | 数据湖存储加速方案的发展和对比分析

百度Geek说

百度 数据湖 存储

一文了解LCD,LED和OLED屏幕的区别

Dylan

技术 LED display LED显示屏 OLED lcd

观测云产品更新 | OpenAPI、应用性能监测、DQL 查询等

观测云

产品迭代

质变科技 AI-ready Data Cloud:从原生分布式缓存加速服务谈Serverless Data Cloud

AI数据云Relyt

NDP 数据云 数据湖 Spark AI-ready 原生分布式缓存

HyperWorks的四面体网格剖分

智造软件

仿真 仿真软件 Hypermesh

七牛云 Miku 直播兼容杜比全景声格式

七牛云

直播 传输协议 七牛云

荣耀开发者服务平台越来越AI

荣耀开发者服务平台

开发者生态 大模型时代 AI智能客服 荣耀HONOR

永州等保测评机构有哪些?电话多少?

行云管家

等保 等级保护 等保测评 永州

人工智能行业定义以及特点简单说明

行云管家

人工智能 堡垒机 智能化 AI智能

【JIT/极态云】技术文档--定时任务

武汉万云网络科技有限公司

京东零售广告创意:基于人类反馈的可信赖图像生成

京东科技开发者

企业如何落地多因素认证?

芯盾时代

身份认证 身份安全 iam 身份和访问管理

个推SDK:人民日报、新华社等数十万App的双十一运营神器

新消费日报

vivo 游戏中心包体积优化方案与实践

vivo互联网技术

动态化 资源配置 包体积优化 PAG

京东零售广告创意:基于人类反馈的可信赖图像生成

京东科技开发者

CST软件如何设置硬件加速选项GPUDCMPItoken

思茂信息

gpu cst CST软件

关键词感知检索

DashVector

数据库 向量检索 大模型

在指标平台市场中,企业的避 “坑” 选择秘籍

Aloudata

大数据 数据分析 指标管理 指标平台 指标开发

解析金融数据存储难题:多元量化如何通过 TDengine 实现高并发与低延时

TDengine

tdengine 时序数据库 数据库·

🥳重磅更新!Fluent Editor 开源富文本支持 LaTeX 可编辑公式啦~

OpenTiny社区

开源 OpenTiny 富文本组件

技术前沿|NeurIPS 2024 中稿快讯!两方密态推理框架 Nimbus,大模型隐私推理场景的重要技术

隐语SecretFlow

淘宝京东商品属性参数接口

tbapi

淘宝商品详情接口 京东商品详情接口

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