为什么这个匿名方法不起作用,而 lambda 却不起作用

本文关键字:不起作用 lambda 方法 为什么 | 更新日期: 2023-09-27 17:57:19

我正在学习匿名方法、lambda 等,但在这里找不到它不起作用的原因:

// this does not work
MyDictionary.Keys.Where(delegate(string s) { s.Length == 5; });
// this works
MyDictionary.Keys.Where(w => w.Length == 5);

为什么这个匿名方法不起作用,而 lambda 却不起作用

你忘了return语句的结果:

MyDictionary.Keys.Where(delegate(string s) { return s.Length == 5; });

delegate视为一个完整的方法,除了命名部分之外,该方法必须尽可能与独立方法相同。因此,您可以将其想象为:

delegate(string s) {
    // you would need to return something here:
    return s.Length == 5; 
}

更新:

另外,请考虑以下 2 个 lambda:

MyDictionary.Keys.Where(w => w.Length == 5); // works
MyDictionary.Keys.Where(w => { w.Length == 5 }); // does not work

为什么第二个不起作用?以这种方式思考以更好地了解正在发生的事情。这只是为了简化图片:

第一个 lambda 是一个语句:w.Length == 5 语句有一个结果,它实际上返回它。不?

但第二个:{ w.Length == 5 }是一个块。块不会返回任何内容,除非您显式执行此操作。

您必须在委托的正文中放置一个return语句,如下所示:

MyDictionary.Keys.Where(delegate(string s) { return s.Length == 5; });

你可以认为 lambda 版本中的箭头暗示了return,这就是它工作的原因。