La razón por la que no se le permite definir una variable con el mismo nombre tanto en el bucle for como fuera del bucle for es porque las variables en el alcance externo son válidas en el alcance interno. Lo que significa que habría dos variables 'i' dentro del ciclo for si se permitiera.
Ver: alcances de MSDN
Específicamente:
El alcance de una variable local declarada en una declaración de variable local (Sección 8.5.1) es el bloque en el que se produce la declaración.
y
El alcance de una variable local declarada en un inicializador for de una instrucción for (Sección 8.8.3) es el inicializador for, la condición for, el iterador for y la instrucción contenida de la instrucción for.
Y también: Declaraciones de variables locales (Sección 8.5.1 de la especificación C #)
Específicamente:
El alcance de una variable local declarada en una declaración de variable local es el bloque en el que se produce la declaración. Es un error hacer referencia a una variable local en una posición textual que precede al declarador de variable local de la variable local. Dentro del alcance de una variable local, es un error en tiempo de compilación declarar otra variable local o constante con el mismo nombre.
(El énfasis es mío).
Lo que significa que el alcance del i
interior de su ciclo for es el ciclo for. Mientras que el alcance del i
exterior de su ciclo for es el método principal completo más el ciclo for. Lo que significa que tendría dos ocurrencias i
dentro del bucle que no es válido de acuerdo con lo anterior.
La razón por la que no se le permite hacer int A = i;
es porque int i
solo tiene un alcance para su uso dentro del for
ciclo. Por lo tanto, ya no es accesible fuera del for
bucle.
Como puede ver, estos dos problemas son el resultado del alcance; El primer problema ( int i = 4;
) daría como resultado dos i
variables dentro del for
alcance del bucle. Mientras que int A = i;
daría como resultado el acceso a una variable que está fuera del alcance.
Lo que podría hacer en su lugar es declarar el i
alcance de todo el método y luego usarlo tanto en el método como en el ámbito del bucle for. Esto evitará romper cualquiera de las reglas.
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;
}
EDITAR :
Por supuesto, el compilador de C # podría modificarse para permitir que este código se compile de manera bastante válida. Después de todo esto es válido:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Pero, ¿sería realmente beneficioso para la legibilidad y facilidad de mantenimiento de su código poder escribir 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);
}
Piense en el potencial de errores aquí, ¿el último i
imprime 0 o 4? Ahora, este es un ejemplo muy pequeño, uno que es bastante fácil de seguir y rastrear, pero definitivamente es mucho menos fácil de mantener y leer que haber declarado el exterior i
con un nombre diferente.
NÓTESE BIEN:
Tenga en cuenta que las reglas de alcance de C # difieren de las reglas de alcance de C ++ . En C ++, las variables solo están dentro del alcance desde donde se declaran hasta el final del bloque. Lo que haría que su código sea una construcción válida en C ++.