【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

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

评论

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

【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

洛神灬殇

redis 性能调优 慢查询

关于环境变量配置的思考总结

timerring

Go 环境变量

极客时间运维进阶训练营第十二周作业

9527

工作这么多年,我总结的数据传输对象 (DTO) 的最佳实践

JAVA旭阳

Java 架构

JSON.stringify() 的 5 使用场景

devpoint

JavaScript 前端开发 JSON格式化

精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)

洛神灬殇

Java JVM JVM原理 2023

CleanMyMacX4.12.2最新版本更新下载

茶色酒

CleanMyMacX

会声会影2023和谐版本补丁包下载

茶色酒

会声会影 会声会影2023

从任务分配角度来看管理

石云升

极客时间 1月月更 技术领导力实战笔记

你知道哈希算法,但你知道一致性哈希吗?

JAVA旭阳

Java 架构

技术如何分担产品之忧?

石云升

极客时间 1月月更 技术领导力实战笔记

FPGA:硬件描述语言简介

timerring

FPGA

我总结了写出高质量代码的12条建议

JAVA旭阳

Java

CleanMyMac X2024汉化版安装包新增

茶色酒

CleanMyMac X CleanMyMac X2023

复习前端:前端应掌握的网络知识

devpoint

OSI七层协议 http2 HTTPS协议加密

开源移动核心网Magma架构设计启示

俞凡

架构 网络 通信

技术管理者如何获得下属的认同?

石云升

极客时间 1月月更 技术领导力实战笔记

我们需要怎样的低代码平台

agnostic

低代码

Portraiture2024汉化版磨皮插件下载

茶色酒

Portraiture2023 Portraiture

【Linux技术专题系列】「必备基础知识」一起探索和实践sftp配置之密钥方式登录

洛神灬殇

Linux SSH SSH工具 sftp

【PHP】英文博客专栏PHP快速入门个人笔记

懒时小窝

php

GLM国产大模型训练加速:性能最高提升3倍,显存节省1/3,低成本上手

OneFlow

人工智能 深度学习

架构误区系列12:一切皆依赖云平台

agnostic

云计算 部署架构

Python 内置界面开发框架 Tkinter入门篇 甲

eng八戒

Python GUI tkinter

OneFlow v0.9.0正式发布

OneFlow

人工智能 深度学习

如何用Know Streaming来查询Kafka的消息

石臻臻的杂货铺

Kafk

如何快速优雅的用Know Streaming创建Topic

石臻臻的杂货铺

获取 topic等信息 后端、

万字长文搞懂产品模式和项目模式

俞凡

团队管理

CleanMyMac X2024版本值不值得买?

茶色酒

CleanMyMac X CleanMyMac X2023

复习前端:JavaScript V8 引擎机制

devpoint

chrome JIT V8

【腾讯云AI】用1行Python代码识别增值税发票,YYDS

程序员晚枫

Python 人工智能 发票 OCR

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