Оператор обзора C#

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

int foo = { printf("bar"); 1 };

Действительно ли там что-то эквивалентно в C#? Например, если я хочу записать функцию лямбды, которая имеет побочный эффект.

Точка меньше являющееся о побочном эффекте лямбды (просто пример), больше если существует эта функциональность..., например, в шепелявости, у Вас есть зубец

6
задан tbischel 26 February 2010 в 00:05
поделиться

5 ответов

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

За исключением того, что в C # ситуация не так проста, поскольку компилятор не может решить, следует ли компилировать синтаксическое лямбда-выражение как делегат (например, Func ) или как дерево выражения (например, Expression > ), а также может быть любым другим совместимым типом делегата. Итак, вам необходимо создать делегат:

int foo = new Func<int>(() => { 
  Console.WriteLine("bar"); return 1; })(); 

Вы можете немного упростить код, определив метод, который просто возвращает делегат, а затем вызывает метод - компилятор C # автоматически определит тип делегата:

static Func<R> Scope<R>(Func<R> f) { return f; }

// Compiler automatically compiles lambda function
// as delegate and infers the type arguments of 'Scope'
int foo = Scope(() => { Console.WriteLine("bar"); return 1; })(); 

Я согласен, что это это уродливый трюк, который не следует использовать :-), но интересно то, что это можно сделать!

7
ответ дан 8 December 2019 в 04:52
поделиться

Ничто не мешает вам иметь побочные эффекты в лямбда-выражении.

Func<int> expr = () =>
{
    Console.WriteLine("bar");
    return 1;
};
int foo = expr();
7
ответ дан 8 December 2019 в 04:52
поделиться
int foo = (() => { printf("bar"); return 1; })();

Изменить: спасибо за конструктивную критику, это должно быть

int i = ((Func<int>)(() => { printf("bar"); return 1; }))();
5
ответ дан 8 December 2019 в 04:52
поделиться

Мы рассматривали возможность сделать еще более краткий синтаксис, чем ()=>{M(); } для определения лямбды, но так и не смогли найти синтаксис, который и читается хорошо, и не путается с блоками, инициализаторами коллекций/объектов или инициализаторами массивов. Пока что вы застряли с синтаксисом лямбд.

3
ответ дан 8 December 2019 в 04:52
поделиться

Вы говорите об анонимной функции: http://msdn.microsoft.com/en-us/library/bb882516.aspx , думаю.

2
ответ дан 8 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

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