Once again today's posting is presented as a dialogue, as is my wont.
Why is var sometimes required on an implicitly-typed local variable and sometimes illegal on an implicitly typed local variable?
That's a good question but can you make it more precise? Start by listing the situations in which an implicitly-typed local variable either must or must not use var.
Sure. An implicitly-typed local variable must be declared with var in the following statements:
var x1 = whatever;
for(var x2 = whatever; ;) {}
using(var x3 = whatever) {}
foreach(var x4 in whatever) {}
And an implicitly-typed local variable must not be declared with var in the following expressions:
from c in customers select c.Name
customers.Select(c => c.Name)
In both cases it is not legal to put var before c, though it would be legal to say:
from Customer c in customers select c.Name
customers.Select((Customer c) => c.Name)
Why is that?
Well, let me delay answering that by criticizing your question further. In the query expression and lambda expression cases, are those in fact implicitly typed locals in the first place?
Hmm, you're right; technically neither of those cases have local variables. In the lambda case, that is a formal parameter. But a formal parameter behaves almost exactly like a local variable, so it seems reasonable to conflate the two in casual conversation. In the query expression, the compiler is going to syntactically transform the range variable into an untyped lambda formal parameter regardless of whether the range variable is typed or not.
Read more: Eric Lippert’s Blog
QR: