(Я предполагаю, что вы действительно говорите о нескольких утверждениях, а не о нескольких строках.)
Вы можете использовать несколько операторов в лямбда-выражении, используя фигурные скобки, но только синтаксис, который не использует фигурные скобки, может быть преобразован в дерево выражения:
// ValidFunc<int,int> a = x => x +1;Func<int,int> b = x =>{return x +1;};Expression<Func<int,int>> c = x => x +1;// InvalidExpression<Func<int,int>> d = x =>{return x +1;};
Я пытаюсь понять, почему Func разрешает фигурные скобки, а Expression не позволяет. В любом случае Expression будет выполняться как Func. Есть ли способ добавить многострочную логику в дерево выражений? Если нет, то почему это ограничение?
Habeeb
8
@Habeeb: «В любом случае Expression будет выполняться как Func» Не всегда. В большинстве случаев он вообще никогда не компилируется в делегат - просто рассматривается как данные. Деревья выражений в .NET 4.0 действительно получить возможность включать несколько операторов через Expression.Block , но C # язык не поддерживает это. Может, но для этого потребуется больше работы по проектированию / реализации / тестированию.
Джон Скит
26
Вы можете поместить в лямбда-выражение столько символов новой строки, сколько захотите; C # игнорирует символы новой строки.
Вероятно, вы хотели спросить о нескольких утверждениях .
Несколько операторов можно заключить в фигурные скобки.
Не было бы правильнее сказать, что C # одинаково обрабатывает все пробелы, включая символы новой строки? Сказать, что он игнорирует новые строки, звучит немного неверно - создается впечатление, что он просто их полностью удаляет, и вы можете разделить ключевое слово на новую строку или что-то в этом роде.
Tesserex
6
Начиная с C # 7:
Однострочный оператор:
int expr(int x,int y)=> x + y +1;
Многострочный оператор:
int expr(int x,int y){int z =8;return x + y + z +1;};
хотя они называются локальными функциями, я думаю, что это выглядит немного чище, чем приведенное ниже, и фактически то же самое
Func<int,int,int> a =(x, y)=> x + y +1;Func<int,int,int> b =(x, y)=>{int z =8;return x + y + z +1;};
Polity демонстрирует многострочный формат, о котором идет речь в вопросе, а не развлекательные предложения по игре в гольф. Реализация вашего мудрого кода сделала бы его «не ответом»!
Action<int,int> action =(x, y)=>{ X += x; Y += y;};
Это также может быть полезно, если вам нужно написать обычный метод или конструктор в одной строке или когда вам нужно упаковать более одного оператора / выражения в одно выражение:
publicvoidAction(int x,int y)=>(_, _)=(X += x, Y += y);
или
publicvoidAction(int x,int y)=> _ =(X += x, Y += y);
или
publicvoidAction(int x,int y)=>(X, Y)=(X + x, Y + y);
Ответы:
Конечно:
источник
(Я предполагаю, что вы действительно говорите о нескольких утверждениях, а не о нескольких строках.)
Вы можете использовать несколько операторов в лямбда-выражении, используя фигурные скобки, но только синтаксис, который не использует фигурные скобки, может быть преобразован в дерево выражения:
источник
Вы можете поместить в лямбда-выражение столько символов новой строки, сколько захотите; C # игнорирует символы новой строки.
Вероятно, вы хотели спросить о нескольких утверждениях .
Несколько операторов можно заключить в фигурные скобки.
Смотрите документацию .
источник
Начиная с C # 7:
Однострочный оператор:
Многострочный оператор:
хотя они называются локальными функциями, я думаю, что это выглядит немного чище, чем приведенное ниже, и фактически то же самое
источник
источник
Из Лямбда-выражений (Руководство по программированию на C #) :
источник
С С # 7.0 вы также можете использовать это
источник
Допустим, у вас есть класс:
С C # 7.0 внутри этого класса вы можете сделать это даже без фигурных скобок:
и
будет так же, как:
Это также может быть полезно, если вам нужно написать обычный метод или конструктор в одной строке или когда вам нужно упаковать более одного оператора / выражения в одно выражение:
или
или
Подробнее о деконструкции кортежей в документации .
источник