2009-08-23 60 views

回答

27

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

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

2)安德斯认为返回类型协方差不是一个好的语言功能。

3)\我们有很多优先考虑的语言。我们只有有限的预算,所以我们只尝试在特定版本中实现最佳功能。当然,这样会很好,但如果你愿意的话,很容易就可以自己做。更好的是,我们花时间添加了可改善开发人员体验的功能,或为语言添加了更多的表现力。

+0

够公平:),谢谢你的回答。 – 2009-08-25 09:36:19

+7

您是否知道有关#2的其他信息?我喜欢阅读这样的语言问题。 :) – 2010-04-01 18:39:41

+0

Brian Gideon对这个问题的回答提供了一个如何做#1的例子。 – 2010-11-15 20:39:35

5

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

至于理性的原因..它可能从代码可读性的角度来看更可取。

您可以明确地实现接口,并提供返回X的替代签名,该接口不会由接口定义。如果你知道你的IA实际上是一个X,你可以用它来代替。

3

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

1
public X test(); 

您必须为任何非抽象类的方法声明一个主体。

试试这个:

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

interface IA 
{ 
    IB test(); 
} 
interface IB { }; 
15

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

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

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

interface IA 
{ 
    IB test(); 
} 

interface IB 
{ 
} 
+0

+1周边提供的工作。谢谢! – 2009-08-25 09:37:59

相关问题