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

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

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

此function称为“返回类型协方差”。 由于以下原因,C#不支持它:

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

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

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

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

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

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

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

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

因为C#在编译时不支持接口的co和contravriance。 这样,IA.Test()方法的实现必须与其声明完全匹配。 但是,您可以在运行时返回X的实例

 public X test(); 

您必须为任何不抽象的类声明所有方法的主体。

试试这个:

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

这可以帮助http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx您可以使用“out”关键字