Acabo de notar un comportamiento extraño con resolución de sobrecarga.Sobrecarga, inferencia de tipo genérico y la palabra clave 'params'
Supongamos que tengo el siguiente método:
public static void DoSomething<T>(IEnumerable<T> items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(IEnumerable<T> items)");
}
Ahora, sé que este método a menudo se llamará con un pequeño número de argumentos explícitos, por lo que por comodidad añado esta sobrecarga:
public static void DoSomething<T>(params T[] items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(params T[] items)");
}
ahora trato de llamar a estos métodos:
var items = new List<string> { "foo", "bar" };
DoSomething(items);
DoSomething("foo", "bar");
Pero en ambos casos, el se llama sobrecarga con params
. Hubiera esperado que se llamara la sobrecarga IEnumerable<T>
en el caso de un List<T>
, porque parece una mejor coincidencia (al menos para mí).
¿Este comportamiento es normal? ¿Alguien podría explicarlo? No pude encontrar ninguna información clara sobre eso en los documentos de MSDN ... ¿Cuáles son las reglas de resolución de sobrecarga involucradas aquí?
Gracias Jon, esa es exactamente la explicación que necesitaba. ¿Hay algún tipo de solución para que funcione como yo quiero? Si no, supongo que tendré que usar un nombre diferente ... –
Sí, me di cuenta de que funciona si especifico explícitamente el parámetro de tipo genérico. Pero pierdo el beneficio de la inferencia de tipo ... –
Sugeriría usar un nombre diferente, solo por claridad, o si solo vas a usarlo con más de un elemento, podrías hacer '(T primero, params T [] otros) ' –