AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

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

评论

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

一次JVM GC长暂停的排查过程

京东科技开发者

【后台体验】运营后台订单详情设计分享

京东科技开发者

数据驱动决策:观测云在企业战略中的作用

可观测技术

数据结构

Dubbo源码浅析(一)—RPC框架与Dubbo

京东科技开发者

PromQL:观测云中的监控数据分析利器

可观测技术

数据分析

用户体验的优化:观测云在用户行为分析中的应用

可观测技术

用户体验

AI+仿真,助力工业智能化变革:面向仿真工程师的机器学习工具

Altair RapidMiner

人工智能 AI 设计 仿真 altair

10分钟构建Web 应用防火墙-uuWAF

coxi_vv

开源 waf 1Panel

20分钟构建企业知识库

coxi_vv

开源 halo 1Panel 开源知识库

本地部署马斯克开源Grok-1大模型,贝锐花生壳3步实现远程访问

贝锐

AI 内网穿透 Stable Diffusion

案例分享 | 八爪鱼RPA在社区医疗流程自动化系统中的应用

八爪鱼采集器︱RPA机器人

RPA 自动化 流程

实时监控的力量:观测云如何提升业务响应速度

可观测技术

实时监控

AI 流媒体音乐平台 Melodio 发布;多模态模型 VITA 可打断无需唤醒词丨 RTE 开发者日报

声网

每个Moka招聘系统用户都需要一套八爪鱼RPA

八爪鱼采集器︱RPA机器人

RPA 自动化 招聘 智能化

短信验证合规指南

MobTech袤博科技

开发者

数据安全与合规性:观测云在保护企业数据中的角色

可观测技术

数据安全

10分钟构建运维安全审计系统

coxi_vv

开源 运维 1Panel jumpserver

10分钟构建内网邮件服务器

coxi_vv

开源软件 1Panel 开源邮件服务器 邮件服务器

10分钟构建服务监控工具

coxi_vv

监控 Prometheus 1Panel

10分钟构建业务数据大屏

coxi_vv

服务器 数据可视化 开源软件 DataEase 1Panel

Poetry vs npm:两个包管理器的迷人相似性

我再BUG界嘎嘎乱杀

Python 编程 后端 npm Poetry

代理IP为什么很难达到100%的利用率?

IPIDEA全球HTTP

如何在Python中使用免费的DeepL翻译API

幂简集成

Python 翻译 API 免费API

网络安全警钟:Windows TCP/IP协议出现高危漏洞

郑州埃文科技

TCP IP 漏洞

Go 语言 viper 库上手实践

FunTester

别再被坑了! JavaScript类型检测的最佳实践

沉浸式趣谈

JavaScript 数据结构 数据类型

Mobpush 标签推送

MobTech袤博科技

HarmonyOS应用程序访问控制探究

白晓明

HarmonyOS NEXT

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