2011-12-08 28 views
6

¿Alguien puede explicar por qué el siguiente código produce el error? (Compilación en Microsoft Visual Studio 2008)¿Por qué esta llamada es ambigua?

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); 
    } 
} 

el error es

La llamada es ambigua entre los métodos o propiedades siguientes: 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I1)' y 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I2)'

I pensó que el compilador podía distinguir entre dos métodos usando las cláusulas "where"

+0

No creo que las restricciones genéricas califiquen como parte de la firma del método. – oscilatingcretin

+0

Las restricciones genéricas no participan en la resolución de sobrecarga. – Oded

+0

Desafortunadamente esta es una pregunta duplicada. La esencia de esto es que las restricciones genéricas no se tienen en cuenta al encontrar sobrecargas de métodos de coincidencia viables, y el compilador falla antes de considerarlas. Ya hay muchas preguntas sobre SO sobre esto, solo necesito encontrar las palabras clave de búsqueda correctas. –

Respuesta

13

Las restricciones no son parte de la firma de los métodos y, por lo tanto, no se utilizan para la resolución.

0

Restricción no se puede utilizar para resolver la asociación.

Cuestiones relacionadas