我刚刚遇到以下代码(.NET 3.5),它看起来不应该编译给我,但确实如此,并且工作正常:
bool b = selectedTables.Any(table1.IsChildOf));
Table.IsChildOf实际上是一个具有以下签名的方法:
public bool IsChildOf(Table otherTable)
我认为这相当于:
bool b = selectedTables.Any(a => table1.IsChildOf(a));
如果是这样,那么适当的术语是什么?
答案 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鼓励这种代码。