这个问题与this个1高度相关.仅在版本9中才向C#添加了对重写方法的返回类型协方差的支持,仍然不支持接口.我对如何克服这个问题不感兴趣(链接的问题已经有了有效的答案),但我想知道C#中协方差返回类型支持可能存在的潜在问题.

我的意思是,从C++98开始,C++就一直支持协方差返回类型.C#有什么不同,这使得对返回类型协方差的支持成为一个问题?在实施过程中可能会遇到哪些困难?从我天真的Angular 来看,这只是扩展编译判断的问题:您不需要精确的返回类型匹配,而是允许继承.这已经在课堂上完成了.我错过了什么吗?

提问的目的不是比较哪种语言更好,而是了解问题背后的道理,这反过来将有助于更好地理解语言,进而有助于更好地使用语言.

推荐答案

这比听起来更复杂,因为它会导致 destruct 性的变化.

specification for Covariant Return Types还包含一份支持接口协方差的草案.它包括以下部分,我将逐字引用(强调我的):

[建议的接口协方差规范]在技术上是一个突破性的变化,因为下面的程序今天打印"C1.M",但在建议的修订下将打印"C2.M".

using System;

interface I1 { object M(); }
class C1 : I1 { public object M() { return "C1.M"; } }
class C2 : C1, I1 { public new string M() { return "C2.M"; } }
class Program
{
    static void Main()
    {
        I1 i = new C2();
        Console.WriteLine(i.M());
    }
}

Due to this breaking change, we might consider not supporting covariant return types on implicit implementations.

有关此功能的正在进行的讨论可在此处找到:

https://github.com/dotnet/csharplang/issues/49

在过go 的几年里没有发生太多事情,所以我猜这目前并不被社区认为是一个高度优先的扩展.

Csharp相关问答推荐

如何使用Microsoft Curve API从搜索的文件中获取内容(文本)?

将实例绑定方法传递到列表foreach

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

注册通用工厂的C# Dep注入

在Linq中调用需要limit和offset的方法''''

将列表字符串映射为逗号分隔字符串<>

如果属性名为xyz,我需要使用System.Text.Json修改字符串类型的值""<>

Int和uint相乘得到LONG?

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

WeakReference未被垃圾收集

SortedSet.Remove()不会删除SortedSet.Min返回的元素

我想在文本框悬停时在其底部显示一条线

如何使用XmlSerializer序列化带有CDATA节的XML文件?

.NET 6:如何防止系统生成的日志(log)?

如何在不复制或使用输出的情况下定义项目依赖

Postgres ENUM类型在第一次运行时对Dapper不可见

Visual Studio如何使用当前的框架?

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

在Visual Studio 2022中查找Xamarin模板时遇到问题

反序列化我以前使用System.Text.Json序列化的文件时出现异常