Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is this call ambiguous?

Can anyone explain, why does the following code produce the error? (Compiling in 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);
    }
}

the error is

The call is ambiguous between the following methods or properties: 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I1)' and 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I2)'

I thought the compiler could distinguish between two methods using the "where" clauses

like image 617
imaximchuk Avatar asked Dec 08 '11 13:12

imaximchuk


1 Answers

Constraints are not part of the signature for methods and thus are not used for resolution.

like image 172
Mike Cowan Avatar answered Oct 11 '22 20:10

Mike Cowan