下面的代碼在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