I’m looking for a good explanation why one piece of code fails to compile and the other compiles just fine.
Fails:
richTextBox1.Invoke(new MethodInvoker((() => { richTextBox1.AppendText("test"); })));
Gives the error
Method name expected
on the opening parenthesis right after MethodInvoker(. Apparently, I can’t wrap my lambda statements in parentheses.
Compiles:
richTextBox1.Invoke(new MethodInvoker(() => { richTextBox1.AppendText("test"); }));
The questions is – why?
I always took it for granted that I could wrap any method param in parentheses if I wanted but apparently that’s not the case with lambda expressions. I understand that they are somewhat special, but I still can’t see a good reason for this. Maybe I don’t understand something about the syntax. I would really like to get it.
By the way, this presents in VS2008, .NET 3.5 SP1, I haven’t tested it in VS2010 and .NET 4 yet.
It’s not a lambda expression, it’s a parenthesized expression that contains a lambda expression. Therefore, the node for this parameter in the abstract syntax tree for this method invocation would be a parenthesized expression, and not a lambda expression as required by the specification. This is why.
There are other places where the Microsoft C# compiler does violate the specification and accept such an expression even though it shouldn’t (per the specification) but this is not one of them.
The relevant section of the specification is §6.5.