2012-04-03 83 views
1

我很奇怪,爲什麼下面被標記爲VS2010與no suitable method found to override錯誤(.NET 4):默認參數和壓倒一切的

public override string ToString(int foo=0) { 
    // some stuff 
} 

我發現this這似乎有點類似(至少也是令人驚訝的行爲與可選參數),但我不明白爲什麼這種方法不覆蓋ToString()

現在我顯然知道如何輕鬆解決超載的ToString這個問題,所以我不感興趣在解決問題的方法,但在這種限制的理由。

回答

4

它根本沒有相同的簽名。重寫方法僅限於與它們重寫的方法嚴格相同的簽名,並且可選參數不僅僅是用於重載的語法糖;它們也是方法簽名的一部分,甚至是結果IL代碼的一部分。

此:

public virtual string ToString(); 

是不一樣的:

public override string ToString(int foo = 0); 

無論你如何切它。所以,錯誤。

+0

但是有沒有什麼理由呢?我的意思是假定C#+可以很容易地改變這個規則而不會破壞任何東西,在我看來。那麼它只是一種「更簡單的方式」,或者是否存在任何會導致問題的角落案例? – Voo 2012-04-03 01:47:08

+1

@Voo:我想不出任何的角落案例,但它可能會打破'callvirt'(這需要一個特定的方法簽名),無需大量修改。所以......「我認爲這樣簡單」。但有充分的理由。 – Ryan 2012-04-03 01:49:46

0

功能string ToString(int foo=0)有一個參數(即使調用時它不會出現在代碼中),你認爲最主要的一個具有0

0

,您在繼承什麼課?從錯誤'沒有找到合適的方法覆蓋'這個錯誤看來,基類沒有虛擬的ToString方法。大多數默認的c#類不允許重寫ToString。

+1

我猜'對象':)是的,他們通常會允許你重寫'ToString'。實際上,我不能說我見過一個在'ToString'上使用'sealed'的類。 – Ryan 2012-04-03 01:39:15

+0

實際上並不是直接的'object',但是爲了簡單起見,你可以假設一樣好;-)在任何地方都沒有密封的ToString。 – Voo 2012-04-03 01:43:25

1

ToString()ToString(int)是不一樣的。如果您省略了ToString(int foo=0)的參數,那麼寫出ToString(0)也是一樣。 foo是一個具有默認值而不是可選參數的參數。