質問のタイトルを適切に表現したことを願っています。
C# では、(デリゲートとして) ラムダを使用するか、古いデリゲート構文を使用してこれを行うことができます。
Func<string> fnHello = () => "hello";
Console.WriteLine(fnHello());
Func<string> fnHello2 = delegate()
{
return "hello 2";
};
Console.WriteLine(fnHello2());
では、ラムダまたはデリゲートの本体を「インライン化」して、名前付き変数にキャプチャする (匿名にする) ことができないのはなぜでしょうか?
// Inline anonymous lambda not allowed
Console.WriteLine(
(() => "hello inline lambda")()
);
// Inline anonymous delegate not allowed
Console.WriteLine(
(delegate() { return "hello inline delegate"; })()
);
JavaScript で動作する例 (比較のみ) は次のとおりです。
alert(
(function(){ return "hello inline anonymous function from javascript"; })()
);
これにより、予想されるアラート ボックスが生成されます。
更新:適切にキャストすれば、C# でインラインの匿名ラムダを使用できるようですが、() の量によって手に負えなくなり始めます。
// Inline anonymous lambda with appropriate cast IS allowed
Console.WriteLine(
((Func<string>)(() => "hello inline anonymous lambda"))()
);
おそらく、コンパイラは匿名デリゲートの署名を推測して、どの Console.WriteLine() を呼び出そうとしているのかを知ることができませんか? この特定のキャストが必要な理由を知っている人はいますか?