Обобщения, разрешение перегрузки и делегаты (извините, не могу найти лучшего названия) [дубликат]C#

Место общения программистов C#
Ответить
Anonymous
 Обобщения, разрешение перегрузки и делегаты (извините, не могу найти лучшего названия) [дубликат]

Сообщение Anonymous »


Возможный дубликат:

Почему Func неоднозначен с Func?


Я заметил очень странную проблему разрешения перегрузки с дженериками...

Рассмотрите следующие методы:

Код: Выделить всё

static void Foo(TSource element, Func selector)
{
"int".Dump();
}

static void Foo(TSource element, Func selector)
{
"double".Dump();
}

static T Identity(T value)
{
return value;
}
(C# 4, протестировано в LINQPad)

Если я попытаюсь вызвать Foo с помощью лямбда-выражение в качестве селектора, все работает нормально:

Код: Выделить всё

Foo(42, x => x); // prints "int"
Но если я заменю x => x на Identity, компилятор не сможет сделать выбор между двумя перегрузками Foo:

Код: Выделить всё

Foo(42, Identity);
// The call is ambiguous between the following methods or properties:
// 'UserQuery.Foo(int, System.Func)' and
// 'UserQuery.Foo(int, System.Func)'
Как вторая перегрузка может быть подходящим кандидатом? Вывод типа правильно определяет, что TSource имеет значение int, поэтому параметр T для метода Identity также должен быть int, поэтому тип возвращаемого значения должен быть тоже может быть int... Identity может быть Func или Func, но не Func !

И становится еще хуже! Даже если я укажу все параметры типа явно, я все равно получаю ту же ошибку:

Код: Выделить всё

Foo(42, Identity); // The call is ambiguous...
Как здесь может быть какая-то двусмысленность? Насколько я могу судить, перегрузка, принимающая Func, никоим образом не может быть кандидатом. Полагаю, объяснение должно быть где-то в спецификациях, но я не могу найти соответствующую часть... или это может быть ошибка в компиляторе, но я думаю, это маловероятно.

Обратите внимание, что это работает, если я явно создаю делегата:

Код: Выделить всё

Foo(42, new Func(Identity)); // prints "int"
Итак, может кто-нибудь объяснить, что здесь происходит? Кроме того, почему это работает с лямбда-выражением, но не с группой методов?

Подробнее здесь: https://stackoverflow.com/questions/459 ... tter-title
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»