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

C# 为什么这个匿名方法不起作用而lambda起作用?,c#,lambda,anonymous-function,C#,Lambda,Anonymous Function,我正在学习匿名方法、lambdas等,无法找到它在此处不起作用的原因: // this does not work MyDictionary.Keys.Where(delegate(string s) { s.Length == 5; }); // this works MyDictionary.Keys.Where(w => w.Length == 5); 您忘记返回语句的结果: MyDictionary.Keys.Where(delegate(string s) { return

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

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

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

您忘记返回语句的结果:

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; 
}
更新:

另外,请考虑以下两个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版本中,可以将
返回值看作是箭头所暗示的,这就是它工作的原因。

语句lambda与匿名方法一样,不能用于创建表达式树。@AmitKumarGhosh正确,但在这里不相关。此问题将使用
可枚举。Where
(接受委托),而不是
可查询。Where
(接受表达式树)。“此处不起作用”是不够的信息。您应该始终包含收到的错误消息。它是隐含的,但不是箭头。当您编写
w=>{w.Length==5;}
时,您也会遇到同样的问题。第二个示例lambda没有编译。这里的机制不是表达式与块本身的差异,而是一个特殊的lambda规则,它以不同的方式处理裸表达式。@HenkHolterman
第二个示例lambda不编译
->我提到by
不起作用。剩下的:多亏了这一点,我只是想简化一下。我是一名教师,根据我的经验,大多数人都需要一幅清晰简单的图画来开始理解。再次感谢。它只是错过了一个
(编译但仍然不工作)。你的意思是
s=>{s.Length==5;}
?它有一个编译时错误,无法编译,您可以试试。编译的唯一方法是
s=>{returns s.Length==5;}
没错,它仍然无法编译。但有一个比“预期”更有意义的错误。