больше не должен быть применимым членом функции для вызова. Очевидно, что то, что я только что сказал, неверно, но ваш ответ, похоже, не решает эту проблему (так, как я понимаю).
ющий вызов перегруженEnumerable.Select
метод:
var itemOnlyOneTuples = "test".Select<char, Tuple<char>>(Tuple.Create);
терпит неудачу с ошибкой неоднозначности (пространства имен удалены для ясности):
The call is ambiguous between the following methods or properties:
'Enumerable.Select<char,Tuple<char>>
(IEnumerable<char>,Func<char,Tuple<char>>)'
and
'Enumerable.Select<char,Tuple<char>>
(IEnumerable<char>, Func<char,int,Tuple<char>>)'
Я конечно могу понять, почемуне явное указание аргументов типа привело бы к неоднозначности (обе перегрузки были бы применимы), но я не вижу ни одного после этого.
Мне кажется достаточно ясным, что намерение состоит в том, чтобы вызвать первую перегрузку, а аргумент метода-группы разрешается вTuple.Create<char>(char)
, Вторая перегрузка не должна применяться, потому что ни один изTuple.Create
перегрузки могут быть преобразованы в ожидаемыеFunc<char,int,Tuple<char>>
тип. яугадывание компилятор смущенTuple.Create<char, int>(char, int)
, но возвращаемый тип неверен: он возвращает двойной кортеж и поэтому не может быть преобразован в соответствующийFunc
тип.
Кстати, любое из следующего делает компилятор счастливым:
Указание аргумента типа для аргумента группы методов:Tuple.Create<char>
(Возможно, это на самом деле проблема вывода типа?).Делаем аргумент лямбда-выражением вместо группы методов:x => Tuple.Create(x)
, (Хорошо играет с выводом типа наSelect
вызов).Неудивительно, что пытаясь вызвать другую перегрузкуSelect
таким образом также не удается:
var itemIndexTwoTuples = "test".Select<char, Tuple<char, int>>(Tuple.Create);
В чем здесь проблема?