Синтаксис Лямбда-выражения C#: действительно ли скобки необходимы?

Я являюсь новым в C#, и ранее я видел, что лямбда-выражение похоже

(params) => { expression;}

но в LINQ, я видел примеры как

IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);

Никакие скобки.

Действительно ли они - то же или есть ли какое-либо различие?

Большое спасибо.

14
задан Ahmad Mageed 5 June 2010 в 13:58
поделиться

3 ответа

Правила таковы:

Лямбда-выражение имеет вид

( modifier type parameter, modifier type parameter ...) => { statements }

Рассмотрим сначала левую часть.

Модификатором может быть ref, out или вообще ничего.

Если нет модификаторов ref или out, то все типы можно исключить. Если есть любые модификаторы ref или out, то каждое объявление параметра должно иметь объявленный тип. Если any paramter имеет объявленный тип, то every parameter должен иметь объявленный тип. Таким образом, вы можете скрыть типы при условии, что (1) нет ссылок или аутов, и (2) вы скрываете все из них. В противном случае вы должны указать все типы.

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

Вот и все правила о списках параметров. Правила о правой части таковы:

если список утверждений состоит из одного оператора return с выражением:

x => { return x + 1; }

то скобки, ключевое слово return и точка с запятой могут быть опущены:

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)

Обратите внимание, что теперь они потенциально означают что-то другое для читателя! Раньше мы явно отбрасывали возвращаемые значения; теперь ламбды будут читаться как возвращающие их.

Обратите внимание, что это означает, что этот трюк законно проделывать с методами, возвращающими void. Это действительно законно:

x => Console.WriteLine(x)

Фу. Не делайте этого. Если вы имеете в виду

x => { Console.WriteLine(x); } 

то так и скажите. Первый вариант выглядит слишком похоже на то, что вы пытаетесь сказать

x => { return Console.WriteLine(x); }

, что, конечно, незаконно.

25
ответ дан 1 December 2019 в 06:35
поделиться

Скобки нужны только при наличии нескольких параметров.

Обновление (Как это обычно бывает на SO, когда ответы редактируются после ответов других людей...)

Использование скобок (скобки "( )" и скобки "{ }") в данном случае излишне. Эти утверждения эквивалентны. Дополнение Visual Studio, такое как ReSharper, укажет на такие избыточности:

http://www.jetbrains.com/resharper/

5
ответ дан 1 December 2019 в 06:35
поделиться

О каких скобках вы говорите? ( ) или { }?


( ) используются в списке параметров и необходимы, когда у вас более одного параметра:

(a, b, c) => ...

Вы можете опустить их, когда у вас только один аргумент:

a => ...

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

(a, b, c) => {
                 Console.WriteLine("Hello World!");
                 Console.WriteLine("a = {0}", a);
                 Console.WriteLine("b = {0}", b);
                 Console.WriteLine("c = {0}", c);
                 return a * b + c;
             }

Без них тело лямбда-выражения является выражением:

(a, b, c) => a * b + c
15
ответ дан 1 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

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