Не соответствует правильная перегрузка в 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> Таким образом, мы не добрались до разветвителей, которые иначе предпочли бы нормальную форму расширенной форме.

Другие вопросы по тегам