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

Why this anonymous method does not work while the lambda does?

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

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

// this works
MyDictionary.Keys.Where(w => w.Length == 5);

您忘记了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 并且一个语句的结果实际上是 return。不是吗?

但是第二个:{ w.Length == 5 }是一个块。一个块不会 return 任何东西,除非你明确地这样做。

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

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

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