Лямбда-выражение синтаксического сахара? - PullRequest
5 голосов
/ 10 марта 2011

Я только что наткнулся на следующий код (.NET 3.5), который не выглядит так, как будто он должен скомпилироваться для меня, но он работает и отлично работает:

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

Table.IsChildOf на самом деле является методом со следующей подписью:

public bool IsChildOf(Table otherTable)

Прав ли я, думая, что это эквивалентно:

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

и если да, то каков правильный термин для этого?

Ответы [ 3 ]

13 голосов
/ 10 марта 2011

Это преобразование группы методов , и оно было доступно начиная с C # 2. В качестве более простого примера рассмотрим:

public void Foo()
{
}

...

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

Обратите внимание, что это , а не точно так же, как версия лямбда-выражения, которая захватит переменную table1 и создаст новый класс с методом, в котором просто вызывается IsChildOf.Для Any это не важно, но разница будет важна для Where:

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());
5 голосов
/ 10 марта 2011

Выражение table1.IsChildOf называется группа методов .

Вы правы в том, что оно эквивалентно, и действительно, это синтаксический сахар.

2 голосов
/ 10 марта 2011

Это называется группа методов. Решарпер поддерживает такой код.

...