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/1319663/

相关文章:

c# - 提高 Excel 文件创建的性能

c# - 从 JQuery 调用 Web 服务时出错

c# - Java 中 TimeZone.getDefault().getID() 在 C# 中的等效项是什么?

c# - 将存储在对象中的 Enum 数据绑定(bind)到 Winforms ComboBox 中?

.net - System.Net 套接字非常奇怪的自发断开连接

c# - 在 asp.net 中使用隐藏代码在页面加载时显示弹出 div?

c# - 全屏WPF应用程序充当操作系统

c# - 如何跟踪异步/等待任务是否正在运行

c# - 命名空间 'Forms' 中不存在类型或命名空间名称 'System.Windows'

c# - Windows 窗体可见性问题