c# - 为什么 C# 在实现接口(interface)时不允许继承返回类型

标签 c# .net

下面的代码在 C# 中不合法是否有合理的理由?

class X: IA, IB
{
    public X test() // Compliation Error, saying that X is not IB
    {
        return this;
    }
}

interface IA 
{
    IB test();
}
interface IB { };

最佳答案

更新:这个答案写于 2009 年。经过 20 年人们为 C# 提出返回类型协变,看起来它终于要实现了;我比较惊讶。见https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/底部公告;我相信细节会随之而来。


此功能称为“返回类型协方差”。 C# 不支持它的原因如下:

1) CLR 不支持它。为了让它在 C# 中工作,我们必须吐出一大堆小的辅助方法,这些方法将返回类型强制转换为正确的东西。没有什么能阻止您自己这样做。

2) Anders 认为返回类型协变不是一个好的语言特性。

3)\我们对语言有很多更高的优先级。我们只有有限的预算,所以我们尽量在任何给定的版本中只做我们能做的最好的功能。当然,这会很好,但如果您愿意,自己做起来也很容易。我们最好花时间添加功能来改善开发者体验或为语言增加更多的表现力。

关于c# - 为什么 C# 在实现接口(interface)时不允许继承返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49687500/

相关文章:

c# - 使用模式匹配来匹配具有非零下限的数组

c# Expression Lambda 从字符串到 Func<T>

c++ - 如何在不使用 GAC 的情况下使 C++/CLI DLL 解析对托管程序集 (DLL) 的依赖关系?

C# cosmos 文件 IO 和目录

c# - 读取 XML 或 JSON 文件而不是 SQL Server

c# - 保存文件时 Interop.Excel UTF-8 编码

c# - 如何使用 C# 和 ASP.NET 以 P2P 方式传输多媒体文件?

c# - 使用 TimePeriod.NET 的 CalendarPeriodCollector 计算 "working time"给出了意外的结果

.net - 在哪里可以找到.net CLR和C#的源代码?

c# - ObservableCollection 作为参数和接口(interface)传递