3

次のステートメントはまったく問題ありません。

var sb = new string[] { "line1", "line2" };
sb.ForEach(Console.WriteLine); 
// same as sb.ForEach(item => Console.WriteLine(item));

ラムダ式で引数を使用しないこの種のプラクティスの名前は何ですか?

ありがとう、

4

3 に答える 3

10

「メソッド群変換」はあなたが探している用語です。メソッドのグループ (オーバーロード) をデリゲートに自動的に変換します。

この場合、Console.WriteLineすべて同じ名前でオーバーロードされた約 19 の異なるメソッドのグループです。次に、コンパイラは、これらのオーバーロードの 1 つが予想されるデリゲート (Action<String>唯一のデリゲート) と互換性があるかどうかを判断します。一致するものがあるので、あなたのために変換Console.WriteLinenew Action<String>(Console.WriteLine)ます。

于 2012-07-05T20:06:38.790 に答える
9

フォームのラムダをに変換するMethod(x => f(x))ことは、イータリダクションMethod(f)と呼ばれます。C#コンパイラが内部でetaリダクションを実行するかどうかはわかりませんが、メソッドグループ(この場合はConsole.WriteLine)をデリゲート型(おそらくここ)に変換することはサポートしています。Action<string>

C#コンパイラは、オーバーロードConsole.WriteLine(string)Action<string>デリゲートにラップし、それをメソッドに渡しますForEach

C#仕様では、メソッドグループを互換性のあるデリゲート型に変換するためのルールを定義しています。

6.6メソッドグループの変換

メソッドグループ(§7.1)から互換性のあるデリゲートタイプへの暗黙の変換(§6.1)が存在します。デリゲートタイプDとメソッドグループとして分類される式Eが与えられた場合、Eに通常の形式(§7.5.3.1)で構築された引数リストに適用できるメソッドが少なくとも1つ含まれている場合、EからDへの暗黙の変換が存在します。 Dのパラメータタイプと修飾子を使用する

于 2012-07-05T20:07:53.410 に答える
-1

前の回答はどちらも適切ですが、次のようなコードがある場合は追加の回答があります。

int i = 7;
return () => Foo(i);

ラムダにはパラメーターがありませんが、整数を親スコープで囲んでいるため、これはクロージャーと呼ばれるものです。返された匿名メソッドが使用されると、変数 i はスコープ外に出ていないかのように引き続き使用できます...そして、囲まれているため、そうではありません!

元の質問に基づいて、イータ削減またはメソッドグループ変換のいずれかがあなたが示したものです。あなたの質問がどのように表現されたかは、少し閉鎖のように聞こえます。

于 2012-07-09T14:03:34.183 に答える