Подтвердить что ты не робот

Выполнить лямбда-выражение сразу после его определения?

Есть ли способ выполнить выражение лямбда сразу после его определения?

Другими словами (Invalid С# code):

(() => { Console.WriteLine("Hello World"); }).Invoke();
4b9b3361

Ответ 1

Конечно.

new Action(() => { Console.WriteLine("Hello World"); })();

Это должно сделать трюк.

Ответ 2

Еще один "вариант", который является двумя другими ответами в немного другом обличье:

((Action)(() => { Console.WriteLine("Hello World"); }))();

Причина, непосредственно взятая из комментария phoog:

... вы не сказали компилятору, хотите ли вы Action или Expression<Action>. Если вы нарисуете это выражение лямбда на Action, вы сможете вызвать Invoke на нем или использовать синтаксис метода-вызова() для его вызова.

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

Ответ 3

Вы должны иметь возможность сделать это:

Action runMe = () => { Console.WriteLine("Hello World"); };
runMe();

Ответ 4

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

Это всего лишь код клея, чтобы предотвратить запись автономной функции, которая никогда не вызывается нигде. Я использую Func вместо Action, но ответ такой же, как user166390.

        // imagine several dozens of lines that look like this
        // where the result is the return value of a function call
        fields.Add(new ProbeField(){ 
            Command = "A",
            Field = "Average",
            Value = be.GetAverage()
        });

        // now you need something that can't be expressed as function call
        // so you wrap it in a lambda and immediately call it.
        fields.Add(new ProbeField(){ 
            Command = "C",
            Field = "Cal Coeff",
            Value = ((Func<string>)(() => {
                CalCoef coef;
                Param param;
                be.GetCalibrationCoefficients(out coef, out param);
                return coef.lowDet1.ToString();
            }))()
        });