Il motivo per cui non è consentito definire una variabile con lo stesso nome sia nel for-loop che all'esterno del for-loop è perché le variabili nell'ambito esterno sono valide nell'ambito interno. Ciò significa che ci sarebbero due variabili 'i' all'interno del for-loop se questo fosse permesso.
Vedi: MSDN Scopes
In particolare:
L'ambito di una variabile locale dichiarata in una dichiarazione di variabile locale (Sezione 8.5.1) è il blocco in cui si verifica la dichiarazione.
e
L'ambito di una variabile locale dichiarata in un inizializzatore for di un'istruzione for (Sezione 8.8.3) è l'inizializzatore for, la condizione for, l'iteratore for e l'istruzione contenuta dell'istruzione for.
E anche: dichiarazioni di variabili locali (Sezione 8.5.1 della specifica C #)
In particolare:
L'ambito di una variabile locale dichiarata in una dichiarazione di variabile locale è il blocco in cui si verifica la dichiarazione. È un errore fare riferimento a una variabile locale in una posizione testuale che precede il dichiaratore della variabile locale della variabile locale. Nell'ambito di una variabile locale, è un errore in fase di compilazione dichiarare un'altra variabile locale o costante con lo stesso nome.
(Enfasi mia.)
Ciò significa che l'ambito del i
tuo for-loop è il for-loop. Considerando che l'ambito i
esterno del for-loop è l'intero metodo principale più il for-loop. Significa che avresti due occorrenze i
all'interno del loop che non sono valide secondo quanto sopra.
Il motivo per cui non ti è permesso farlo int A = i;
è perché int i
è solo per uso all'interno del for
ciclo. Pertanto non è più accessibile al di fuori del for
ciclo.
Come puoi vedere, entrambi questi problemi sono il risultato dell'ambito; il primo numero ( int i = 4;
) comporterebbe due i
variabili nell'ambito del for
ciclo. Considerando int A = i;
che porterebbe ad accesso a una variabile che è fuori dal campo di applicazione.
Quello che potresti fare invece è dichiarare i
di essere compreso nell'intero metodo e quindi utilizzarlo sia nel metodo che nell'ambito del ciclo for. Ciò eviterà di infrangere entrambe le regole.
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;
}
MODIFICA :
Il compilatore C # potrebbe ovviamente essere modificato per consentire a questo codice di essere compilato in modo abbastanza valido. Dopo tutto ciò è valido:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Ma sarebbe davvero utile per la tua leggibilità e manutenibilità del codice poter scrivere codice come:
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);
}
Pensa al potenziale errore qui, l'ultima i
stampa 0 o 4? Ora questo è un esempio molto piccolo, che è abbastanza facile da seguire e tracciare ma è sicuramente molto meno gestibile e leggibile che aver dichiarato l'esterno i
con un nome diverso.
NB:
Nota: le regole di scoping di C # differiscono dalle regole di scoping di C ++ . In C ++ le variabili sono solo nell'ambito da dove vengono dichiarate fino alla fine del blocco. Il che renderebbe il tuo codice un costrutto valido in C ++.