5

次のコード(.NET 3.5)に出くわしました。これは、コンパイルする必要があるようには見えませんが、コンパイルでき、正常に動作します。

bool b = selectedTables.Any(table1.IsChildOf));

Table.IsChildOfは、実際には次のシグネチャを持つメソッドです。

public bool IsChildOf(Table otherTable)

これは次のことと同等だと思いますか?

bool b = selectedTables.Any(a => table1.IsChildOf(a));

もしそうなら、これの適切な用語は何ですか?

4

3 に答える 3

13

これはメソッドグループ変換であり、C#2以降で使用できます。より簡単な例として、次のことを考慮してください。

public void Foo()
{
}

...

ThreadStart x = Foo;
ThreadStart y = new ThreadStart(Foo); // Equivalent code

これは、変数をキャプチャし、を呼び出すだけのメソッドで新しいクラスを生成するラムダ式バージョンとはまったく同じではないことに注意してください。それは重要ではありませんが、違い次の場合に重要になります。 table1IsChildOfAnyWhere

var usingMethodGroup = selectedTables.Where(table1.IsChildOf);
var usingLambda = selectedTables.Where(x => table1.IsChildOf(x));
table1 = null;

// Fine: the *value* of `table1` was used to create the delegate
Console.WriteLine(usingMethodGroup.Count());

// Bang! The lambda expression will try to call IsChildOf on a null reference
Console.WriteLine(usingLambda.Count());
于 2011-03-10T10:45:09.637 に答える
5

この式table1.IsChildOfメソッドグループと呼ばれます。

あなたはそれが同等であるという点で正しいです、そして確かにこれは構文糖衣です。

于 2011-03-10T10:38:17.860 に答える
2

これはメソッドグループと呼ばれます。Resharperは、この種のコードを推奨しています。

于 2011-03-10T10:39:59.600 に答える