Не соответствует правильная перегрузка в C#
У меня есть следующая программа
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Program
{
public static string Foo<T>(params T[] items)
{
return "A";
}
public static string Foo<T>(IEnumerable<T> items)
{
return "B";
}
static void Main()
{
List<int> items = new List<int>(){0,1,23};
Console.WriteLine(Foo(items));
Console.WriteLine(Foo("XXX"));
}
}
какие выводы
A
A
скорее, чем
B
A
Учитывая, что List является подклассом IEnumerable, почему общий params
Формируйте совпадение ранее с компилятором и дайте неожиданный ответ.
1 ответ
Когда вызывается часть спецификации "лучший элемент функции" (раздел 7.5.3.2), рассматриваемый список параметров находится в расширенной форме (поскольку первый метод применим только в его расширенной форме). В этот момент вы сравниваете два вызова вроде этого:
public static string Foo<T>(T[] items)
Foo(new[] { items });
а также
public static string Foo<T>(IEnumerable<T> items)
Foo(items);
Преобразование из List<int>[]
в List<int>[]
это "лучшее преобразование", чем преобразование из List<T>
в IEnumerable<T>
Таким образом, мы не добрались до разветвителей, которые иначе предпочли бы нормальную форму расширенной форме.