我刚刚遇到以下代码 (.NET 3.5),它看起来不应该编译给我,但它确实可以,并且工作正常:
bool b = selectedTables.Any(table1.IsChildOf));
Table.IsChildOf 实际上是一个具有以下签名的方法:
public bool IsChildOf(Table otherTable)
我认为这等同于:
bool b = selectedTables.Any(a => table1.IsChildOf(a));
如果是这样,正确的说法是什么?
最佳答案
这是一个方法组转换,从 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());
关于c# - Lambda 表达式语法糖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5258470/