c# - Lambda 表达式语法糖?

标签 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));

如果是这样,正确的说法是什么?

最佳答案

这是一个方法组转换,从 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/

相关文章:

c# - 为什么这个 lambda 闭包虽然没有在运行时执行,但会产生垃圾?

vb.net - 'ByRef' 参数 '<parametername>' 不能在 lambda 表达式中使用

c++ - 是否可以以任何方式(使用C++预处理器等)将shared_ptr<T>替换为T$,将weak_ptr<T>替换为T%,将unique_ptr<T>替换为T?

c# - 通过颜色权重选择图像部分上的点

c# - 如何从分组依据生成 html 字符串

c++ - 通过 Lambda 解压可变参数

javascript - <boolean expression> && statement() 是否与 if(<boolean expression>) statement() 相同?

c++ - 我可以使单个模板<typename T> 应用于多个定义/声明吗?

c# - 仅从 API 返回对象属性的子集

c# - 如何使用 Petapoco 将自动增量 ID 设置为另一列