2009-08-23 87 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

相關問題