O motivo pelo qual você não pode definir uma variável com o mesmo nome no loop for e fora do loop for é porque as variáveis no escopo externo são válidas no escopo interno. Significando que haveria duas variáveis 'i' dentro do loop for, se isso fosse permitido.
Consulte: Escopos do MSDN
Especificamente:
O escopo de uma variável local declarada em uma declaração de variável local (Seção 8.5.1) é o bloco em que a declaração ocorre.
e
O escopo de uma variável local declarada no inicializador for de uma instrução for (Seção 8.8.3) é o inicializador, a condição for, o iterador e a instrução contida na instrução for.
E também: Declarações de variáveis locais (Seção 8.5.1 da especificação C #)
Especificamente:
O escopo de uma variável local declarada em uma declaração de variável local é o bloco em que a declaração ocorre. É um erro referir-se a uma variável local em uma posição textual que precede o declarador de variável local da variável local. No escopo de uma variável local, é um erro em tempo de compilação declarar outra variável ou constante local com o mesmo nome.
(Ênfase minha.)
O que significa que o escopo do i
interior do loop for é o loop for. Considerando que o escopo da parte i
externa do loop for é todo o método principal mais o loop for. Ou seja, você teria duas ocorrências i
dentro do loop que são inválidas de acordo com o acima.
A razão pela qual você não pode fazer isso int A = i;
é porque o int i
escopo é apenas para uso dentro do for
loop. Portanto, não é mais acessível fora do for
loop.
Como você pode ver, esses dois problemas são resultado do escopo; o primeiro problema ( int i = 4;
) resultaria em duas i
variáveis no for
escopo do loop. Considerando int A = i;
que resultaria no acesso a uma variável que está fora do escopo.
Em vez disso, o que você pode fazer é declarar o i
escopo definido para todo o método e usá-lo no método e no escopo do loop for. Isso evitará violar qualquer regra.
public static void Main()
{
int i;
for (i = 0; i < 5; i++)
{
}
// 'i' is only declared in the method scope now,
// no longer in the child scope -> valid.
i = 4;
// 'i' is declared in the method's scope -> valid.
int A = i;
}
EDIT :
Obviamente, o compilador C # pode ser alterado para permitir que esse código seja compilado com bastante validade. Depois de tudo isso é válido:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Mas seria realmente benéfico para a legibilidade e a manutenção do código poder escrever código como:
public static void Main()
{
int i = 4;
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Console.WriteLine(i);
}
Pense no potencial de erros aqui, o último i
imprime 0 ou 4? Agora, este é um exemplo muito pequeno, fácil de seguir e rastrear, mas é definitivamente muito menos sustentável e legível do que ter declarado o exterior i
com um nome diferente.
NB:
Observe que as regras de escopo do C # diferem das regras de escopo do C ++ . Em C ++, as variáveis estão apenas no escopo de onde são declaradas até o final do bloco. O que tornaria seu código uma construção válida em C ++.