Есть ли способ выполнить выражение лямбда сразу после его определения?
Другими словами (Invalid С# code):
(() => { Console.WriteLine("Hello World"); }).Invoke();
Есть ли способ выполнить выражение лямбда сразу после его определения?
Другими словами (Invalid С# code):
(() => { Console.WriteLine("Hello World"); }).Invoke();
Конечно.
new Action(() => { Console.WriteLine("Hello World"); })();
Это должно сделать трюк.
Еще один "вариант", который является двумя другими ответами в немного другом обличье:
((Action)(() => { Console.WriteLine("Hello World"); }))();
Причина, непосредственно взятая из комментария phoog:
... вы не сказали компилятору, хотите ли вы
Action
илиExpression<Action>
. Если вы нарисуете это выражение лямбда наAction
, вы сможете вызвать Invoke на нем или использовать синтаксис метода-вызова() для его вызова.
Конечно, он становится уродливым, но я не знаю места, где эта форма когда-либо полезна, поскольку она не может использоваться для рекурсии без имени...
Вы должны иметь возможность сделать это:
Action runMe = () => { Console.WriteLine("Hello World"); };
runMe();
Вот пример того, как это можно использовать. Вы хотите инициализировать конструктор с результатом нескольких строк кода, которые не могут быть записаны как функция, потому что именно так структурирован сторонний 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();
}))()
});