定義直後にラムダ式を実行する方法はありますか?
つまり (無効な C# コード):
(() => { Console.WriteLine("Hello World"); }).Invoke();
もちろん。
new Action(() => { Console.WriteLine("Hello World"); })();
これでうまくいくはずです。
別の「オプション」。これは、わずかに異なる形式の他の 2 つの回答です。
((Action)(() => { Console.WriteLine("Hello World"); }))();
その理由は、phoog のコメントから直接引用したものです。
... が必要かどうかをコンパイラに伝えていませ
Action
んExpression<Action>
。そのラムダ式を にキャストAction
すると、それに対して Invoke を呼び出すか、メソッド呼び出し構文 () を使用して呼び出すことができます。
しかし、それは確かに醜くなり、名前なしで再帰に使用できないため、このフォームが役立つ場所を知りません...
これがどのように使用されるかの例を次に示します。サードパーティの 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();
}))()
});
これを行うことができるはずです:
Action runMe = () => { Console.WriteLine("Hello World"); };
runMe();