任何人都可以解釋,爲什麼下面的代碼會產生錯誤? (在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」子句區分兩種方法
我不認爲通用約束符合方法簽名的一部分。 – oscilatingcretin
通用約束不參與重載解析。 – Oded
這不幸是一個重複的問題。其要點在於,在尋找可行的匹配方法重載時,通用約束不被考慮,編譯器在考慮這些約束之前失敗。這裏有很多關於這個的問題,我只需要找到正確的搜索關鍵字。 –