Je viens de remarquer un comportement étrange avec une résolution de surcharge.Surcharge, inférence de type générique et le mot-clé 'params'
Supposons que j'ai la méthode suivante:
public static void DoSomething<T>(IEnumerable<T> items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(IEnumerable<T> items)");
}
Maintenant, je sais que cette méthode sera souvent appelée avec un petit nombre d'arguments explicites, donc pour des raisons pratiques ajouter cette surcharge:
public static void DoSomething<T>(params T[] items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(params T[] items)");
}
maintenant, je tente d'appeler ces méthodes:
var items = new List<string> { "foo", "bar" };
DoSomething(items);
DoSomething("foo", "bar");
Mais dans les deux cas, la surcharge avec params
est appelée. Je m'attendrais à ce que la surcharge IEnumerable<T>
soit appelée dans le cas d'un List<T>
, parce que cela semble être un meilleur match (du moins pour moi).
Ce comportement est-il normal? Quelqu'un pourrait-il l'expliquer? Je n'ai pas pu trouver d'informations claires à ce sujet dans les documents MSDN ... Quelles sont les règles de résolution de surcharge impliquées ici?
Merci Jon, c'est exactement l'explication dont j'avais besoin. Existe-t-il une solution de rechange pour que cela fonctionne comme je le veux? Sinon, je suppose que je devrais utiliser un nom différent ... –
Oui, j'ai remarqué que cela fonctionne si je spécifie explicitement le paramètre de type générique. Mais je perds le bénéfice de l'inférence de type ... –
Je suggère d'utiliser un nom différent, juste pour plus de clarté - ou si vous allez l'utiliser avec plus d'un élément, vous pourriez faire '(T d'abord, params T [] autres) ' –