为什么不能在一个接口实现返回一个更具体的类型?(Why can't an interface

2019-06-24 21:59发布

如果一个接口指定的属性或方法,以返回另一个界面,它为什么不允许第一界面“变革”的返回类型的实现为更具体的类型?

让我们举个例子来说明:

interface IFoo
{
    IBar GetBar();
}
interface IBar
{ }

class Foo : IFoo
{
    // This is illegal, we are not implementing IFoo properly
    public Bar GetBar()
    {
        return new Bar();
    }
}

class Bar : IBar
{ }

我知道如何使它发挥作用,那不是我的问题。

我只能之一:

  • 更改返回类型GetFoo()IBar ,或
  • 明确实现该接口并调用GetBarIFoo.GetBar()方法

什么我真的问的是不只是让上面的代码编译的理由。 是否有一个地方上面不履行规定的合同无论如何IFoo

Answer 1:

通常情况下,我会说,这将是平衡利益对抗的支持这样的功能增加的复杂性的情况。 (所有功能采取的努力,设计,文档,实现,测试,然后开发人员需要过于的教育他们。)请注意,可能会有一些显著的复杂性,如果你想支持恢复其实现的接口的值类型,例如(如在不同的表示结束了,而不是只是一个参考)。

在这种情况下,我不相信 CLR甚至支持这样的功能,这将使它很难为C#这样做干净。

我同意这将是一个非常有用的功能,但我怀疑它并没有被认为足够有用,以保证所需的额外工作。



Answer 2:

你问的功能被称为“返回类型协方差”。 如前所述维基百科上 ,Java和C ++都有它,这或许使得它令人惊讶的是C#不。

埃里克利珀证实了这个答案,这个功能没有实现,因为它不被认为值得实施工作的意见。 (该决定亲自埃里克这个答案指派专人负责的以前的版本,他说,这是不正确的,如果任何一个人负责这是安德斯·海尔斯伯格。)

无论如何,现在有各种建议,将其添加到语言(见https://github.com/dotnet/roslyn/issues/357 , https://github.com/dotnet/csharplang/blob/master/proposals/covariant -returns.md , https://github.com/kingces95/coreclr/issues/2 ),也许这将让你在未来几年实现。 每这些讨论中,它听起来并不像有为什么要功能在C# 中的原则并不存在任何深刻的原因-相反,它只是从来没有到目前为止被判定值得任何人的落实工作。



文章来源: Why can't an interface implementation return a more specific type?