An issue came up on another forum and I knew how to fix it, but it revealed a feature of the compiler peculiar to me. The person was getting the error “Embedded statement cannot be a declaration or labeled statement” because they had a declaration of a variable following an if statement with no brackets. That was not their intent, but they had commented out the line of code immediately following the if statement, which made the variable declaration the de facto line of code to execute. Anyway, that’s the background, which brings me to this.
The following code is illegal
if (true)
int i = 7;
However, if you wrap that in brackets, it’s all legal.
if (true)
{
int i = 7;
}
Neither piece of code is useful. Yet the second one is OK. What specifically is the explanation for this behavior?
The C# language specification distinguishes between three types of statements (see chapter 8 for more details). In general you can have these statements:
gotostatementIn the
ifstatement the body has to be embedded-statement, which explains why the first version of the code doesn’t work. Here is the syntax ofiffrom the specification (section 8.7.1):A variable declaration is declaration-statement, so it cannot appear in the body. If you enclose the declaration in brackets, you’ll get a statement block, which is an embedded-statement (and so it can appear in that position).