2011-12-08 19 views
6

誰でも説明できますが、なぜ次のコードでエラーが発生しますか? 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I1)を' と 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I2)' なぜこの呼び出しはあいまいですか?

I:(マイクロソフトの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); 
    } 
} 

エラーが

呼び出しは次のメソッドやプロパティ間の曖昧ですコンパイラはwhere句を使用して2つのメソッドを区別できると考えました

+0

ジェネリック制約がメソッドシグネチャの一部として修飾されるとは思いません。 – oscilatingcretin

+0

一般的な制約は、過負荷解決に関与しません。 – Oded

+0

これは残念ながら重複した質問です。要点は、実行可能なマッチングメソッドのオーバーロードを検出するときにジェネリック制約が考慮されず、それらを考慮する前にコンパイラが失敗するということです。ここにはこれに関する多くの質問がありますので、適切な検索キーワードを見つけるだけです。 –

答えて

13

制約はメソッドのシグニチャの一部ではないため、解決には使用されません。

0

制約を使用して関連付けを解決することはできません。

関連する問題