写点什么

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

评论

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

modsim32笔记 启动modbus tcp服务

万里无云万里天

Modbus Modbus Tcp modsim

kepserver基础 创建opc ua server,进行匿名登录

万里无云万里天

工业控制 kepserver OPCUA

modbus slave基础 查看四个地址范围的占位特点

万里无云万里天

工业控制 Modbus协议

天猫店铺商品数据接口集成指南与实战技巧

tbapi

天猫API接口 天猫店铺所有商品接口 天猫店铺整店商品接口 天猫店铺商品数据采集

XIAOJUSURVEY的Vue3升级之路

XIAOJUSURVEY

前端 vite Vue 3 VueRouter Pinia

Go 语言 context 包实践

FunTester

rabbitmq-server基础 windows安装rabbitmq-server,启用mqtt服务

万里无云万里天

windows RabbitMQ mqtt

win11基础 查看防火墙的状态

万里无云万里天

防火墙 win11

CX1概念车空气动力学设计,打造典型“美式肌肉车”风格

Altair RapidMiner

人工智能 汽车 仿真 车企数字化 altair

求职季来了,让通义灵码陪你高效备战

阿里巴巴云原生

阿里云 云原生 通义灵码

37GAMES Nova(AI-CodeReview)介绍

三七互娱后端技术团队

AI CodeReview

“算法票友”搭档“技术博主”,他们说算子开发就像玩游戏打怪

Alter

AI 算法 算子

观测云加入华为云「新加坡云联盟」,引领亚太创新潮流

观测云

监控

线上交流会预告!和鲸科技社区合伙人唐铭分享“学科+AI”课程搭建思路

ModelWhale

AI 直播 教学 分享会

2024益普索Ipsos全球人工智能监测报告

财见

erlang基础 windows系统安装erlang

万里无云万里天

erlang 测试环境

win11基础 查看本地用户和组

万里无云万里天

win11

怎么在PPT中插入视频?3个PPT常用的使用技巧分享!

彭宏豪95

人工智能 效率工具 PPT AIGC AI生成PPT

从“+AI”到“AI+”,英特尔与生态伙伴共推AI大模型应用落地

E科讯

云启AI,数领未来|Zilliz 华北地区高层闭门会圆满结束

Zilliz

程序员 AI Milvus Zilliz 向量数据库

Kmesh v0.4发布!迈向大规模 Sidecarless 服务网格

华为云开发者联盟

云计算 云原生 华为云开发者联盟 企业号2024年7月PK榜

求职季来了,让通义灵码陪你高效备战

阿里云云效

阿里云 云原生 通义灵码

Adobe Illustrator 和 Photoshop 迎来新 AI 功能;马斯克将训练全球最强 AI丨 RTE 开发者日报

声网

NFTScan 浏览器现已支持 .mint 域名搜索功能!

NFT Research

blockchain NFT NFT\

美航通过 NocoBase 节省了 70% 的物流系统升级成本

NocoBase

开源 系统设计 低代码 无代码开发

rabbitmq-server基础 mqttfx连接server

万里无云万里天

RabbitMQ IoT mqtt

天猫商品评论接口:从申请到应用全攻略

tbapi

天猫商品评论接口 天猫API 天猫评论数据接口 天猫评论数据采集 天猫评论API

英特尔联合国际奥委会打造AI聊天机器人,助力多国运动员迎战巴黎奥运会

E科讯

什么是企业全历史行为数据?为什么它是ToB大客户营销的最佳助手?

客户在哪儿AI

ToB营销 ToB获客 大客户营销 企业全历史行为数据

数据分析新贵——DuckDB入门

三七互娱后端技术团队

数据分析 duckdb

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