Почему компилятор не может вывести этот аргумент типа из использованияC#

Место общения программистов C#
Ответить
Anonymous
 Почему компилятор не может вывести этот аргумент типа из использования

Сообщение Anonymous »

Этот вопрос основан на результатах другого моего вопроса SO. Мой новый вопрос заключается не в том, как заставить X работать, а в том, почему X не работает.

Я создал упрощенный пример своей проблемы, однако, если вы хотите увидеть практическое применение/ситуацию, которую я использую, посмотрите на мой первоначальный вопрос (приведенные ниже функции на самом деле не делают ничего полезного).

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

T bar(Func f) { return default(T); }
bool foo(int i) { return true; }
Теперь у меня есть 3 строки кода, которые работают должным образом и выполняют одну и ту же задачу.

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

int num;
num = bar(foo);
num = bar(new Func(foo));
num = bar((int i) => true );
Мой вопрос: «Почему мне нужно явно указывать T для bar для первого примера?» Причина, по которой мне это интересно, заключается в том, что компилятор превращает первые два примера в одну и ту же строку кода. Используя ILSpy, я вижу, что код компилируется так.

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

num = Program.bar(new Func(Program.foo));
num = Program.bar(new Func(Program.foo));
num = Program.bar((int i) => true);
Я не понимаю, почему компилятор не может вывести тип из того факта, что у меня есть только одна функция с именем foo, и она, так сказать, соответствует шаблону . Теперь, если бы я создал другую функцию bool foo(bool i), я бы понял, если бы компилятор пожаловался на некоторую двусмысленность и не знал, какую из них я хочу, и что мне следует явно указать аргумент типа.< /p>

Конечно, это просто моя ленивость, но я именно этого ожидал и был удивлен, когда компилятор не восполнил мою слабость.>

Подробнее здесь: https://stackoverflow.com/questions/224 ... from-usage
Ответить

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

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

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

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

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