2012-04-17 4 views
22

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

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

待機...何ですか?なぜラムダ式ですか? – scottheckel

+4

あなたのコードが無効であるのは、あなたが 'Action'か' Expression 'かどうかをコンパイラに伝えていないからです。そのラムダ式を 'Action'にキャストすると、' Invoke'を呼び出すか、メソッド呼び出し構文 '()'を使って呼び出すことができます。 – phoog

+4

私の想像力は私には失敗するかもしれませんが、実際にこれを行う必要がありますか? –

答えて

32

わから:すなわち(無効なC#コード)で

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

これはすべきことです。

3

あなたがこれを行うことができるようになります。

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

修正。コンパイラは、ラムダ構文をデリゲートの略語として解釈します。これは、 'Expression '型に代入して、式ツリーを構築する場合のみです。 – Tejs

+3

コンパイラは、 'Action'か' Expression 'が必要かどうかを判断できないので、コンパイルされません。 – phoog

+1

@phoogが正しいです。これはコンパイルされません。 "ラムダ式を暗黙的に型指定されたローカル変数に代入することはできません。" –

12

若干異なる装ってちょうど他の2つの答えであるもう一つの「オプション」、:

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

理由、として直接phoogのコメントから取得しました

...あなたはコンパイラに言ったことはありませんあなたはActionまたはExpression<Action>が欲しいです。 のラムダ式をActionにキャストした場合は、Invokeを呼び出すか、メソッド呼び出し構文()を使用して呼び出すことができます。

どのようにこの例をそれは確かしかし醜い取得し、私はそれが名前のない再帰のために使用することはできないとして、このフォームは、これまでに便利な場所を知らない...

+0

Yコンビネータを使用して、これで再帰を行うことができます:' public delegate T Recursive (再帰的 f、T n); static void Main(string [] args){System.Console。新しい再帰的((f、n)=> f(f、n))(新しい再帰的な((f、n)=>(n == 0)?1:基本的に関数fをパラメータとして宣言し、fを渡して再帰的に呼び出すことは、純粋に関数的な世界からのハックです。f(f、n - 1))、5)再帰を開始するには、この関数を 'f'を呼び出して' f'を呼び出す別の関数に渡し、パラメータの初期値を返します。 –

1

をここです使用することができる。サードパーティAPIがどのように構造化されているので、関数として書くことができない数行のコードの結果でコンストラクタを初期化したいとします。

他の場所では決して呼び出されないスタンドアロン機能を書くのを防ぐための単なるグルーコードです。私はActionの代わりにFuncを使用していますが、答えは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(); 
      }))() 
     }); 
関連する問題