Следующий вызов перегруженного метода 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
. Вторая перегрузка не должна применяться, поскольку ни одна из перегрузок Tuple.Create
не может быть преобразована в ожидаемый тип Func
. Я предполагаю , что компилятор сбивает с толку Tuple.Create
, но его возвращаемый тип неверен: он возвращает кортеж из двух элементов, и поэтому не может быть преобразован в соответствующий тип Func
.
Между прочим, любое из следующего делает компилятор счастливым:
Tuple.Create
(Возможно, это действительно проблема с выводом типа?) x => Tuple.Create (x)
. (Хорошо сочетается с выводом типа в вызове Select
.) Неудивительно, что попытка вызвать другую перегрузку Select
таким образом также не удалась:
var itemIndexTwoTuples = "test".Select>(Tuple.Create);
Что именно здесь проблема?