c# - 实现接口(interface)返回类型协方差可能存在哪些困难?

标签 c# overriding covariance

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

我的意思是,自 C++98 以来,C++ 在很长一段时间内都支持协方差返回类型。 C# 中有何不同,导致返回类型协方差的支持成为问题?实现过程中可能遇到哪些困难?从我天真的角度来看,这只是扩展编译检查的问题:您允许继承,而不是要求精确的返回类型匹配。这已经为类(class)完成了。我在这里缺少什么?

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

最佳答案

它比听起来更复杂,因为它会导致重大更改。

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

[The proposed specification for interface covariance] is technically a breaking change, as the program below prints "C1.M" today, but would print "C2.M" under the proposed revision.

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

过去几年没有发生太多事情,所以我想目前社区不认为这是一个高优先级的扩展。

关于c# - 实现接口(interface)返回类型协方差可能存在哪些困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76480601/

相关文章:

scala - 当未明确给出返回类型时,为什么可以用返回 String 的方法覆盖返回 Unit 的方法?

python - 我想找到 pandas 数据框中 1 列与所有其他列之间的协方差

c# - 方法组重载决议与方法调用重载决议有何不同?

具有泛型子类化的 Java 自动返回类型协变

c# - 反序列化和构造函数的关系

c# - 在只读字段和 getter-only 属性之间使用一种方式比另一种方式有什么好处?

c# - 我需要访问组合框的非公共(public)成员(突出显示的项目)

c# - 我的静态 C# 函数正在和我玩游戏……太奇怪了!

C# 依赖注入(inject)和策略模式

php - 是否可以覆盖默认的 PHP 函数?