39

定義直後にラムダ式を実行する方法はありますか?

つまり (無効な C# コード):

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

6 に答える 6

53

もちろん。

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

これでうまくいくはずです。

于 2012-04-17T20:11:42.917 に答える
21

別の「オプション」。これは、わずかに異なる形式の他の 2 つの回答です。

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

その理由は、phoog のコメントから直接引用したものです。

... が必要かどうかをコンパイラに伝えていませActionExpression<Action>。そのラムダ式を にキャストActionすると、それに対して Invoke を呼び出すか、メソッド呼び出し構文 () を使用して呼び出すことができます。

しかし、それは確かに醜くなり、名前なしで再帰に使用できないため、このフォームが役立つ場所を知りません...

于 2012-04-17T20:21:47.670 に答える
3

これがどのように使用されるかの例を次に示します。サードパーティの 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();
            }))()
        });
于 2015-08-31T15:06:34.977 に答える
3

これを行うことができるはずです:

Action runMe = () => { Console.WriteLine("Hello World"); };
runMe();
于 2012-04-17T20:12:11.373 に答える