Вы используете битовую маску, как указано в 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.
Я полагаю, что Ваш первый образец на самом деле создает анонимную функцию, которая может взять много различных подписей, тело которых является отдельным оператором Console.WriteLine...
. Поскольку это может соответствовать различным подписям, это не вызывает проблему. Во втором образце сам синтаксис лямбды определяет функцию, которая не берет параметров с тем же телом. Очевидно, последний не согласовывается с определенным Действием, таким образом, Вы получаете ошибку.
существует один случай, в котором анонимный метод обеспечивает функциональность, не найденную в лямбда-выражениях. Анонимные методы позволяют Вам опустить список параметров, и это означает, что анонимный метод может быть преобразован в делегатов со множеством подписей. Это не возможно с лямбда-выражениями.
Уточнить ответ 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")
, Который не очень симпатичен и я подозреваю, что это подозревает, не находится в духе лямбда-выражений.
Как другие сказали, нет, Вы не можете пропустить объявление параметров к лямбде. Но для чистоты я предлагаю дать им имя такой как _. Например
foo.Click += (_,__) => { ... }
Вы не игнорируете их серовато-синий, но Вы указываете, что не заботитесь о том, что они и не будут использовать их.
() =>... синтаксис явно указывает, что лямбда не берет параметров. Возможно, язык мог быть изменен так, чтобы () => действительно предназначенный "Вывели параметры этой лямбды для меня" таким же образом, синтаксис делегата делает, но это сделало бы язык более сложным. При разработке новых функций языка Вы запускаете в минус 100 , и я не думаю, что этот проходит тест.
может также быть больше технических причин, почему это было бы трудно реализовать (который является, вероятно, больше в соответствии с тем, что Вы просили, но я сомневаюсь, что технические причины управляли этим решением, если оно когда-нибудь подходило).
Я сказал бы, что это должно иметь принудительное использование параметров лямбда-выражения.
Берут Ваш первый пример, как Вы взаимодействовали бы с переданным в значении, нет никакого локального представления его.