Duplicar posibles:
Generic methods and method overloading¿Por qué las ambigüedades con los genéricos son inconsistentes, en lugar de generar errores?
Decir que tengo una clase como
class SortedList<K>
{
public string this[int i] { get { return "a"; /* dummy sample code */ } }
public string this[K key] { get { return "b"; /* dummy sample code */ } }
}
Ahora digamos que un tío decide utilizarlo:
static string Test1<K>(K key) { return new SortedList<K>()[key]; }
El compilador resuelve esta llamada a la sobrecarga K key
.
Ahora, el contraste con esta diciendo
static string Test2(int key) { return new SortedList<int>()[key]; } // whoops
donde el compilador resuelve este int i
a la sobrecarga.
Ahora bien, si un alma pobre dice Test1(0)
, obtendrá un resultado diferente si dice Test2(0)
, aunque los cuerpos se ven muy idénticos a primera vista.
Lo más gracioso es que, en ningún caso, el compilador o el tiempo de ejecución detectan una ambigüedad y dan un error.
En su lugar, el tiempo de ejecución simplemente cambia su comportamiento con respecto a si el valor es genérico o no, lo que puede ser claramente inesperado para la persona que llama.
¿Por qué es el comportamiento inconsistente?
O, mejor aún, ¿por qué no hay error de compilación (o tiempo de ejecución) debido a la ambigüedad?
@SergRogovtsev: ¡Guau, buen descubrimiento! No lo vi; parece responder esto perfectamente.Deberíamos votar para cerrar mi pregunta entonces. – Mehrdad