Правила:
Лямбда-выражение имеет вид
( modifier type parameter, modifier type parameter ...) => { statements }
Давайте сначала рассмотрим левую сторону.
Модификатор может быть ref, out или вообще ничего.
Если модификаторов ref или out нет, тогда все типы могут быть исключены. Если есть любые ref или out модификаторы, то каждое объявление параметра должно иметь объявленный тип. Если любой параметр имеет объявленный тип, тогда каждый параметр должен иметь объявленный тип. Таким образом, вы можете исключить типы при условии, что (1) нет рефсов или аутов, и (2) вы исключаете всех из них. В противном случае вы должны предоставить все типы.
Если существует ровно один параметр и его тип был исключен, то скобки вокруг списка параметров также могут быть опущены.
Это все правила для списков параметров. Правила о правой стороне:
, если список операторов состоит из одного оператора return с выражением:
x => { return x + 1; }
тогда скобки, ключевое слово возврата и точка с запятой могут быть исключены:
x => x + 1
Более того, если список операторов состоит из одного оператора, который является выражением оператора:
x => { x++; } // Not returning the value of x++; only useful for the side effects
x => { new Y(x); } // weird! executing a ctor only for its side effects! But legal!
x => { M(x); } // note, not returning the value of M(x) even if there is one.
тогда также допустимо исключать скобки и точку с запятой:
x => x++
x => new Y(x)
x => M(x)
Обратите внимание, что теперь они потенциально могут означать что-то другое для читателя! Раньше мы явно отбрасывали возвращаемые значения; теперь лямбды будут читаться как , возвращая их.
Обратите внимание, что это означает, что законно делать этот трюк с пустыми методами возврата . Это действительно законно:
x => Console.WriteLine(x)
Тьфу. Не делай этого. Если ты имеешь в виду
x => { Console.WriteLine(x); }
тогда скажи это вместо этого. Первое выглядит слишком похоже на то, что вы пытаетесь сказать
x => { return Console.WriteLine(x); }
что, конечно, было бы незаконно.