2011-12-08 214 views
6

任何人都可以解釋,爲什麼下面的代碼會產生錯誤? (在Microsoft Visual Studio 2008編譯)這個呼叫爲什麼不明確?

class Base1 { }; 
class Base2 { } 

interface I1 { } 
interface I2 { } 

class C : I1, I2 { } 

static class Program 
{ 

    static T M1<T>(this T t, I1 x) where T : Base1 
    { 
     return t; 
    } 

    static T M1<T>(this T t, I2 x) where T : Base2 
    { 
     return t; 
    } 

    static void Main(string[] args) 
    { 
     Base1 b1 = new Base1(); 
     C c = new C(); 
     b1.M1(c); 
    } 
} 

誤差

的調用以下方法或屬性之間曖昧: 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I1)' 和 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I2)'

我認爲編譯器可以使用「where」子句區分兩種方法

+0

我不認爲通用約束符合方法簽名的一部分。 – oscilatingcretin

+0

通用約束不參與重載解析。 – Oded

+0

這不幸是一個重複的問題。其要點在於,在尋找可行的匹配方法重載時,通用約束不被考慮,編譯器在考慮這些約束之前失敗。這裏有很多關於這個的問題,我只需要找到正確的搜索關鍵字。 –

回答

13

約束不是方法簽名的一部分,因此不用於解析。

0

約束無法用於解決關聯。