2010-04-06 10 views
8

Tengamos un ejemplo simplificado siguiente:Sobrecarga de C# con genéricos: ¿error o característica?

void Foo<T>(IEnumerable<T> collection, params T[] items) 
{ 
    // ... 
} 

void Foo<C, T>(C collection, T item) 
    where C : ICollection<T> 
{ 
    // ... 
} 

void Main() 
{ 
    Foo((IEnumerable<int>)new[] { 1 }, 2); 
} 

compilador dice:

El tipo 'System.Collections.Generic.IEnumerable' no se puede usar como parámetro de tipo 'C' en el tipo genérico o método 'UserQuery.Foo (C, T)'. No hay conversión de referencia implícita de 'System.Collections.Generic.IEnumerable' a 'System.Collections.Generic.ICollection'.

Si cambio a Main:

void Main() 
{ 
    Foo<int>((IEnumerable<int>)new[] { 1 }, 2); 
} 

Se trabajará bien. ¿Por qué el compilador no elige la sobrecarga derecha?

+0

realmente no hay ninguna conversión entre IEnumerable e ICollection. – nothrow

+1

@Yossarian: dos cosas. Primero, hay una conversión explícita. Quiere decir "realmente no hay una conversión de referencia implícita". En segundo lugar, la pregunta no es "¿por qué estoy obteniendo un error de 'conversión implícita'?" En segundo lugar, la pregunta es "¿por qué el algoritmo de resolución de sobrecarga elige un candidato de coincidencia exacta que no es válido en lugar de elegir el candidato válido pero peor que no coincide exactamente?" –

Respuesta

15

Su pregunta fue respondida aquí.

http://blogs.msdn.com/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx

Lea también los aproximadamente un millón de comentarios que me dice que estoy mal por algún comentario adicional interesante sobre este tema.

+0

Ok. Gracias por la respuesta rápida :) Siempre tengo que esperar mucho antes de poder aceptar la respuesta :) –

+0

Sabía que leía este artículo y lo estaba buscando ... pero obviamente usted conoce su blog mejor que yo y encuentre los artículos más rápido, lo cual es bastante justo ... ^^ – tanascius

2

Supongo que el compilador elige la mejor coincidencia antes de utilizar la restricción genérica. En su ejemplo, el método con la restricción es preferible porque no tiene un último parámetro params.

Editar - Eric Lippert confirma esto en su respuesta.

+0

Sí. Gracias a ti también:) –

Cuestiones relacionadas