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

Вы используете битовую маску, как указано в http://php.net/manual/en/function.json-encode.php :

json_encode($array, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);

Это будет добавьте двоичные значения JSON_PRETTY_PRINT и JSON_UNESCAPED_UNICODE с двоичным оператором OR.

26
задан Andrew Hare 3 February 2009 в 12:34
поделиться

5 ответов

Я полагаю, что Ваш первый образец на самом деле создает анонимную функцию, которая может взять много различных подписей, тело которых является отдельным оператором Console.WriteLine.... Поскольку это может соответствовать различным подписям, это не вызывает проблему. Во втором образце сам синтаксис лямбды определяет функцию, которая не берет параметров с тем же телом. Очевидно, последний не согласовывается с определенным Действием, таким образом, Вы получаете ошибку.

Анонимная Ссылка Метода C#

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

19
ответ дан tvanfosson 25 September 2019 в 07:46
поделиться

Уточнить ответ tvanfosson; это поведение описано в спецификации языка C# 3.0 (В§7.14):

поведение лямбда-выражений и анонимных выражений метода является тем же за исключением следующих моментов:

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

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

• тело лямбда-выражения может быть выражением или блоком операторов, тогда как орган по анонимному выражению метода должен быть блоком операторов.

•, Так как только лямбда-выражения могут иметь орган по выражению, никакое анонимное выражение метода не может быть успешно преобразовано в тип дерева выражений (В§4.6).

я думаю:

Action<int> action = () => Console.WriteLine("lambda");

эквивалент:

Action<int> action = delegate() { Console.WriteLine("delegate"); };

, который не скомпилировал бы также. Как Daniel Plaisted говорит (), явно говорит, что нет никаких параметров.

, Если был эквивалент делегата {}, это могло бы быть:

Action<int> action = => Console.WriteLine("lambda")

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

8
ответ дан codybartfast 25 September 2019 в 07:46
поделиться

Как другие сказали, нет, Вы не можете пропустить объявление параметров к лямбде. Но для чистоты я предлагаю дать им имя такой как _. Например

foo.Click += (_,__) => { ... }

Вы не игнорируете их серовато-синий, но Вы указываете, что не заботитесь о том, что они и не будут использовать их.

5
ответ дан MichaelGG 25 September 2019 в 07:46
поделиться

() =>... синтаксис явно указывает, что лямбда не берет параметров. Возможно, язык мог быть изменен так, чтобы () => действительно предназначенный "Вывели параметры этой лямбды для меня" таким же образом, синтаксис делегата делает, но это сделало бы язык более сложным. При разработке новых функций языка Вы запускаете в минус 100 , и я не думаю, что этот проходит тест.

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

2
ответ дан Daniel Plaisted 25 September 2019 в 07:46
поделиться

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

Берут Ваш первый пример, как Вы взаимодействовали бы с переданным в значении, нет никакого локального представления его.

0
ответ дан Aaron Powell 25 September 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: