It looks like you are concerned with the order of declaration (redeclaring a
after the if
blocks).
Consider the case that it is declared before the if
blocks. Then you would expect it to be available within the scope of those blocks.
int a = 1;
if(true)
{
var b = a + 1; // accessing a from outer scope
int a = 2; // conflicts
}
There is not really a concept of "not in scope yet" at compile time.
You can actually create an inner scope with just bare curly braces:
{
int a = 1;
}
if(true)
{
int a = 2; // works because the a above is not accessible in this scope
}