为什么围绕lambda语句的括号会导致语法错误?

Dyp*_*ppl 10 c# lambda syntax-error visual-studio-2008 c#-3.0

我正在寻找一个很好的解释为什么一段代码无法编译而另一段编译就好了.

失败:

richTextBox1.Invoke(new MethodInvoker((() => { richTextBox1.AppendText("test"); })));
Run Code Online (Sandbox Code Playgroud)

给出错误

预期的方法名称

在后面的左括号上MethodInvoker(.显然,我不能用括号括起我的lambda语句.

编译:

richTextBox1.Invoke(new MethodInvoker(() => { richTextBox1.AppendText("test"); }));
Run Code Online (Sandbox Code Playgroud)

问题是 - 为什么?

我总是理所当然地认为如果我想要的话我可以在括号中包装任何方法参数,但显然不是lambda表达式的情况.我知道它们有点特别,但我仍然看不出有充分的理由.也许我对语法一无所知.我真的很想得到它.

顺便说一下,这出现在VS2008,.NET 3.5 SP1中,我还没有在VS2010和.NET 4中测试它.

jas*_*son 7

它不是lambda表达式,它是包含lambda表达式的带括号的表达式.因此,此方法调用的抽象语法树中此参数的节点将是带括号的表达式,而不是规范要求的lambda表达式.这就是为什么.

在其他地方,Microsoft C#编译器确实违反了规范并接受了这样的表达式,即使它不应该(根据规范),但这不是其中之一.

规范的相关部分是§6.5.

  • 事实上,有很多地方C#编译器默默地删除括号,因为严格阅读规范是不合法的.在绝大多数情况下,它没有任何区别,它显然做了用户的意图,所以我不会强调它.我实际上有点惊讶,事实上这确实是一个错误.:-) (5认同)
  • @Dyppl:`Func <int> F(){return(()=> 1); }`是合法的,但根据规范,它不应该是. (3认同)