为什么接口实现不能返回更具体的类型?

如果接口指定了返回另一个接口的属性或方法,为什么第一个接口的实现不允许将返回类型“更改”为更具体的类型?

我们举一个例子来说明:

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 ,或
  • 显式实现接口,只需从IFoo.GetBar()方法调用GetBar

我真正要问的是不仅允许上面的代码编译的原因。 有没有上述情况不符合IFoo规定的合同。

通常,我会说这是一个平衡利益与支持这种function的额外复杂性的情况。 (所有function都需要设计,记录,实现,测试,然后开发人员也需要了解它们。)请注意,如果您想支持返回实现接口的值类型,可能会有一些重大的复杂性,例如(因为它以不同的表示forms结束,而不仅仅是参考)。

在这种情况下,我不相信 CLR甚至支持这样的function,这将使C#很难干净地完成。

我同意这将是一个有用的function,但我怀疑它不足以保证所需的额外工作。

您询问的function称为“返回类型协方差” 。 正如维基百科上所指出的那样,Java和C ++都有它,这可能让C#没有意外。

Eric Lippert在对此答案的评论中确认此function未实现,因为它不值得实施。 (此答案的先前修订版对Eric的个人负责;他说这是不正确的,如果任何一个人负责,那就是Anders Hejlsberg。)

无论如何,现在有各种建议将其添加到该语言中(参见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# – 相反,它从来没有被判断为值得任何人努力实现。