Я только что заметил странное поведение с разрешением перегрузки.
Предположим, у меня есть следующий метод:
public static void DoSomething<T>(IEnumerable<T> items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(IEnumerable<T> items)");
}
Теперь я знаю, что этот метод часто вызывается с небольшим количеством явных аргументов, поэтому для удобства я добавлю эту перегрузку:
public static void DoSomething<T>(params T[] items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(params T[] items)");
}
Теперь я пытаюсь вызвать эти методы:
var items = new List<string> { "foo", "bar" };
DoSomething(items);
DoSomething("foo", "bar");
Но в обоих случаях вызывается перегрузка с params
. Я ожидал бы, что перегрузка IEnumerable<T>
будет вызвана в случае List<T>
, потому что это кажется лучшим соответствием (по крайней мере мне).
Это нормальное поведение? Кто-нибудь может это объяснить? Я не смог найти никакой четкой информации об этом в документах MSDN ... Какие правила разрешения перегрузки используются здесь?