Powodem, dla którego nie możesz definiować zmiennej o tej samej nazwie zarówno w pętli for, jak i poza nią, jest to, że zmienne w zakresie zewnętrznym są prawidłowe w zakresie wewnętrznym. Oznacza to, że gdyby było to dozwolone, w pętli for byłyby dwie zmienne „i”.
Zobacz: Zakresy MSDN
Konkretnie:
Zakres zmiennej lokalnej zadeklarowanej w deklaracji zmiennej lokalnej (sekcja 8.5.1) to blok, w którym występuje deklaracja.
i
Zakres zmiennej lokalnej zadeklarowanej w inicjatorze for instrukcji for (Rozdział 8.8.3) to inicjalizator for, warunek for, iterator for oraz instrukcja zawarta w instrukcji for.
A także: Deklaracje zmiennych lokalnych (sekcja 8.5.1 specyfikacji C #)
Konkretnie:
Zakres zmiennej lokalnej zadeklarowanej w deklaracji zmiennej lokalnej to blok, w którym deklaracja występuje. Błędem jest odwoływanie się do zmiennej lokalnej w pozycji tekstowej, która poprzedza deklarator zmiennej lokalnej zmiennej lokalnej. W zakresie zmiennej lokalnej błędem w czasie kompilacji jest zadeklarowanie innej zmiennej lokalnej lub stałej o tej samej nazwie.
(Podkreśl moje.)
Co oznacza, że zakresem i
wewnętrznej pętli for jest pętla for. Z kolei zasięg i
zewnętrznej pętli for to cała główna metoda plus pętla for. Oznacza to, że miałbyś dwa wystąpienia i
wewnątrz pętli, które są nieprawidłowe zgodnie z powyższym.
Powodem, dla którego nie możesz tego zrobić, int A = i;
jest to, że int i
jest on przeznaczony tylko do użytku w for
pętli. Dlatego nie jest już dostępny poza for
pętlą.
Jak widać, obie te kwestie są wynikiem określania zakresu; pierwsza kwestia ( int i = 4;
) spowodowałaby powstanie dwóch i
zmiennych w zakresie for
pętli. Natomiast int A = i;
skutkowałoby dostępem do zmiennej, która jest poza zakresem.
Zamiast tego można zadeklarować i
zakres dla całej metody, a następnie użyć go zarówno w metodzie, jak i w zakresie pętli for. Pozwoli to uniknąć złamania którejkolwiek zasady.
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;
}
EDYCJA :
Kompilator C # można oczywiście zmienić, aby umożliwić poprawną kompilację tego kodu. W końcu to jest ważne:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Ale czy naprawdę korzystne byłoby dla czytelności i łatwości utrzymania kodu, gdybyśmy mogli pisać taki kod, jak:
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);
}
Pomyśl o potencjale błędów tutaj, czy ostatni i
wydruk wyświetla 0 lub 4? To bardzo mały przykład, który jest dość łatwy do naśladowania i śledzenia, ale jest zdecydowanie mniej łatwy w utrzymaniu i czytelności niż zadeklarowanie zewnętrznej i
pod inną nazwą.
Uwaga:
Należy pamiętać, że reguły zakresu C # różnią się od reguł określania zakresu C ++ . W C ++ zmienne znajdują się tylko w zakresie od miejsca ich zadeklarowania do końca bloku. Co uczyniłoby twój kod prawidłową konstrukcją w C ++.