Перегруженный аргумент группы методов мешает разрешению перегрузки?

Следующий вызов перегруженного метода Enumerable.Select :

var itemOnlyOneTuples = "test".Select>(Tuple.Create);

завершается ошибкой неоднозначности (пространства имен удалены для ясности):

The call is ambiguous between the following methods or properties: 
'Enumerable.Select>
           (IEnumerable,Func>)'
and 
'Enumerable.Select>
          (IEnumerable, Func>)'

I может, конечно, понять, почему не явное указание аргументов типа приведет к неоднозначности (будут применяться обе перегрузки), но после этого я не вижу ни одного.

Мне кажется достаточно очевидным, что намерение состоит в том, чтобы вызвать первую перегрузку, при этом аргумент группы методов разрешается в Tuple.Create (char) . Вторая перегрузка не должна применяться, поскольку ни одна из перегрузок Tuple.Create не может быть преобразована в ожидаемый тип Func > . Я предполагаю , что компилятор сбивает с толку Tuple.Create (char, int) , но его возвращаемый тип неверен: он возвращает кортеж из двух элементов, и поэтому не может быть преобразован в соответствующий тип Func .

Между прочим, любое из следующего делает компилятор счастливым:

  1. Указание аргумента типа для аргумента группы методов: Tuple.Create (Возможно, это действительно проблема с выводом типа?)
  2. Создание аргумента в виде лямбда-выражения вместо группы методов: x => Tuple.Create (x) . (Хорошо сочетается с выводом типа в вызове Select .)

Неудивительно, что попытка вызвать другую перегрузку Select таким образом также не удалась:

var itemIndexTwoTuples = "test".Select>(Tuple.Create);

Что именно здесь проблема?

8
задан Ani 5 March 2011 в 17:07
поделиться