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

Pio*_*pla 23 .net c#

有没有合理的理由说明为什么下面的代码在C#中不合法?

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

interface IA 
{
    IB test();
}
interface IB { };
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 33

此功能称为"返回类型协方差".由于以下原因,C#不支持它:

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

2)Anders认为返回类型协方差不是一个好的语言特征.

3)\我们有很多更高的语言优先级.我们的预算有限,因此我们只尝试在任何给定版本中尽我们所能.当然,这会很好,但如果你愿意的话,这很容易就可以自己做.更好的是,我们花时间添加功能,以改善开发人员的体验或为语言添加更多的代表性功能.

  • 您知道是否有关于#2的任何其他信息?我喜欢阅读类似的语言问题.:) (10认同)

Bri*_*eon 17

您可以使用显式接口实现来避免此问题.

class  X : IA, IB
{
  public X test()
  {
    return this;
  }

  IB IA.test()
  {
    return this;
  }
}

interface IA
{
  IB test();
}

interface IB
{
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*rin 5

签名必须与接口指定的内容完全匹配.没有理由不能X从方法返回实例,但必须使用方法签名IB.

至于理性的原因......从代码可读性的角度来看,这可能是最好的.

您可以显式实现接口,并提供返回X未由接口定义的备用签名.如果你知道你IA的实际上是一个X,你可以使用它.