Because your indentation is misleading, the first code actually is:
var s = "Nice";
switch (s)
{
case "HI":
break;
const string x = "Nice";
case x:
Console.Write("Y");
break;
}
That is, x
is declared inside a case
statement (though after a break
), where it is valid. However, directly inside a switch
statement it’s invalid – the only valid statements there are case
and default
.
Furthermore, const
declarations are evaluated at compile time, so x
is defined even though there’s a break
statement before.
However, note that the Mono C# compiler will not compile this code, it complains that “the name ‘x
’ does not exist in the current scope” so Mono seems to implement more checks than the .NET compiler. However, I can’t find any rules in the C# standard which forbid this use of the const
declaration so I assume that the .NET compiler is right and the Mono compiler is wrong.