Lambda表达语法糖?

时间:2011-03-10 10:37:06

标签: c# lambda syntactic-sugar

我刚刚遇到以下代码(.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 个答案:

答案 0 :(得分:13)

这是一个方法组转换,它自C#2开始提供。作为一个更简单的例子,请考虑:

public void Foo()
{
}

...

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

请注意,与lambda表达式版本完全相同,后者将捕获变量 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());

答案 1 :(得分:5)

表达式table1.IsChildOf称为method group

你是对的,因为它是等价的,而且确实这是语法糖。

答案 2 :(得分:2)

它被称为方法组。 Resharper鼓励这种代码。