Using a variable name used in a child scope [duplicate]

I've been wondering why in C# using a variable name used previously in a child scope is not allowed. Like this:

if (true)
{
    int i = 1;
}

int i = 2;

Compiling the above code produces an error:

A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

And yet you can't use the variable defined in child scope either. The code above works just fine in Java and I can see no reason why it doesn't in C# too. I'm sure there's a good reason, but what is it?


Solution 1:

It is a design choice made by the designers of C#. It reduces potential ambiguity.

You can use it in one of the two places, inside the if or outside, but you can only define it in one place. Otherwise, you get a compiler error, as you found.

Solution 2:

Something I noticed that was not noted here. This will compile:

for (int i = 0; i < 10; i++)
{
    int a = i * 2;
}
for (int i = 0; i < 5; i++)
{
    int b = i * 2;
}

Taken together, these design decisions seem inconsistent, or at least oddly restrictive and permissive, respectively.