下面的代码在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 { };
下面的代码在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 { };
此功能被称为“返回类型协方差”。由于以下原因,C#不支持它:
1)CLR不支持它。为了使它在C#中工作,我们必须吐出一大堆小帮助方法,这些方法在返回类型上转换为正确的东西。没有什么能阻止你自己做这件事。
2)安德斯认为返回类型协方差不是一个好的语言功能。
3)\我们有很多优先考虑的语言。我们只有有限的预算,所以我们只尝试在特定版本中实现最佳功能。当然,这样会很好,但如果你愿意的话,很容易就可以自己做。更好的是,我们花时间添加了可改善开发人员体验的功能,或为语言添加了更多的表现力。
签名必须完全匹配接口指定的内容。没有理由不能从方法中返回X
的实例,但方法签名必须使用IB
。
至于理性的原因..它可能从代码可读性的角度来看更可取。
您可以明确地实现接口,并提供返回X
的替代签名,该接口不会由接口定义。如果你知道你的IA
实际上是一个X
,你可以用它来代替。
因为C#在编译时不支持接口的共同点和矛盾。这样IA.Test()方法的实现必须完全匹配它的声明。但是,您可以在运行时返回X的实例
public X test();
您必须为任何非抽象类的方法声明一个主体。
试试这个:
class X : IA, IB
{
public IB test()
{
return new X();
}
}
interface IA
{
IB test();
}
interface IB { };
你可以使用显式接口实现,以避免此问题。
class X : IA, IB
{
public X test()
{
return this;
}
IB IA.test()
{
return this;
}
}
interface IA
{
IB test();
}
interface IB
{
}
+1周边提供的工作。谢谢! – 2009-08-25 09:37:59
这可以帮助 http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx 您可以使用“出”关键字
C#4.0的此功能仅支持通用接口和代理。它不会像问题示例中所指定的那样IA不是通用接口,而是很好找到。请参阅http://msdn.microsoft.com/en-us/library/dd233059.aspx。 – 2011-09-22 11:27:11
够公平:),谢谢你的回答。 – 2009-08-25 09:36:19
您是否知道有关#2的其他信息?我喜欢阅读这样的语言问题。 :) – 2010-04-01 18:39:41
Brian Gideon对这个问题的回答提供了一个如何做#1的例子。 – 2010-11-15 20:39:35