Как анонимные методы пропускают список параметров?

Я читал это в документации MSDN на странице Анонимные методы (Руководство по программированию на C #), но я не понимаю, что такое пропуск списка параметров. Он говорит:

Есть один случай, когда анонимный метод предоставляет функциональные возможности, которых нет в лямбда-выражениях. Анонимные методы позволяют опускать список параметров. Это означает, что анонимный метод можно преобразовать в делегатов с различными подписями. Это невозможно с лямбда-выражениями.

Не могли бы вы привести пример отсутствия списка параметров для анонимного метода?


person Damian    schedule 07.04.2014    source источник
comment
См. Множество других потоков, например пример ключевого слова делегата против лямбда-нотации и все связанные с ним потоки.   -  person Jeppe Stig Nielsen    schedule 08.04.2014
comment
Я отредактировал вопрос и проголосовал за его повторное открытие. Думаю, теперь ясно. Но для ответа вы можете посмотреть мой ответ здесь   -  person nawfal    schedule 03.07.2014
comment
stackoverflow.com/questions/505850/   -  person Ken Kin    schedule 30.03.2015


Ответы (1)


Я думаю, вы запутались в лямбда-выражениях и анонимных методах. Что вам нужно понять, так это то, что лямбда-выражения - это просто синантические сахара. Например, вы можете создать анонимный метод, который принимает 2 целочисленных параметра и возвращает integer следующим образом:

Func<int, int, int> func = delegate(int x, int y)
                           {
                                return x + y;
                           };

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

Func<int, int, int> func2 = (x,y) => x + y;

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

Action act = () => Console.WriteLine("hello world");

В результате лямбда-выражения позволяют создавать анонимные методы с меньшим кодом, и у них нет никаких недостатков по сравнению с анонимными методами, потому что это совершенно разные вещи. Вы сравниваете яблоки с апельсинами.

person Selman Genç    schedule 07.04.2014
comment
Но старый анонимный метод в стиле C # 2 может полностью опускать все параметры, как и для нулевой функции двух аргументов, это может быть Func<int, int, int> funcZero = delegate { return 0; };. При использовании лямбда-синтаксиса вы должны указать оба параметра (даже если вы их не используете), но их типы могут быть выведены, поэтому Func<int, int, int> funcZero = (x, y) => 0;. - person Jeppe Stig Nielsen; 08.04.2014
comment
@JeppeStigNielsen, о чем спрашивает OP. Вы могли бы дать ответ! - person nawfal; 03.07.2014
comment
Ответ - не ответ, а комментарий. - person Evgeni Nabokov; 09.12.2018