Der Grund, warum Sie eine Variable mit demselben Namen sowohl in der for-Schleife als auch außerhalb der for-Schleife nicht definieren dürfen, liegt darin, dass Variablen im äußeren Bereich im inneren Bereich gültig sind. Dies bedeutet, dass es innerhalb der for-Schleife zwei 'i'-Variablen geben würde, wenn dies zulässig wäre.
Siehe: MSDN-Bereiche
Speziell:
Der Gültigkeitsbereich einer in einer Deklaration für lokale Variablen deklarierten lokalen Variablen (Abschnitt 8.5.1) ist der Block, in dem die Deklaration erfolgt.
und
Der Gültigkeitsbereich einer lokalen Variablen, die in einem for-Initialisierer einer for-Anweisung (Abschnitt 8.8.3) deklariert ist, ist der for-Initialisierer, die for-Bedingung, der for-Iterator und die enthaltene Anweisung der for-Anweisung.
Und außerdem: Deklarationen lokaler Variablen (Abschnitt 8.5.1 der C # -Spezifikation)
Speziell:
Der Gültigkeitsbereich einer lokalen Variablen, die in einer Deklaration für lokale Variablen deklariert ist, ist der Block, in dem die Deklaration erfolgt. Es ist ein Fehler, auf eine lokale Variable an einer Textposition zu verweisen, die vor dem Deklarator der lokalen Variablen der lokalen Variablen steht. Im Bereich einer lokalen Variablen ist es ein Fehler bei der Kompilierung, eine andere lokale Variable oder Konstante mit demselben Namen zu deklarieren.
(Hervorhebung von mir.)
Dies bedeutet, dass der Bereich i
innerhalb Ihrer for-Schleife die for-Schleife ist. Während der Umfang der i
Außenseite Ihrer for-Schleife die gesamte Hauptmethode plus die for-Schleife ist. Das heißt, Sie hätten zwei Vorkommen i
innerhalb der Schleife, die gemäß den obigen Angaben ungültig sind.
Der Grund, warum Sie dies nicht dürfen, int A = i;
ist, dass int i
es nur für die Verwendung innerhalb der for
Schleife vorgesehen ist. Somit ist es außerhalb der for
Schleife nicht mehr zugänglich .
Wie Sie sehen können, sind beide Probleme auf das Scoping zurückzuführen. Das erste Problem ( int i = 4;
) würde zu zwei i
Variablen innerhalb des for
Schleifenbereichs führen. Während int A = i;
würde der Zugang zu einer Variablen führen , dass der Rahmen ist aus.
Sie können stattdessen deklarieren i
, dass der Gültigkeitsbereich für die gesamte Methode gilt, und ihn dann sowohl in der Methode als auch im for-loop-Bereich verwenden. Dadurch wird vermieden, dass eine der beiden Regeln verletzt wird.
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 :
Der C # -Compiler könnte natürlich geändert werden, damit dieser Code vollständig gültig kompiliert werden kann. Immerhin ist dies gültig:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Aber wäre es wirklich vorteilhaft für Ihre Lesbarkeit und Wartbarkeit von Code, Code schreiben zu können, wie zum Beispiel:
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);
}
Denken Sie hier über mögliche Fehler nach. Druckt der letzte i
Ausdruck 0 oder 4 aus? Dies ist ein sehr kleines Beispiel, das leicht zu verfolgen und zu verfolgen ist, aber definitiv viel weniger wartbar und lesbar ist, als das Äußere i
mit einem anderen Namen deklariert zu haben .
NB:
Bitte beachten Sie, dass sich die Gültigkeitsregeln von C # von den Gültigkeitsregeln von C ++ unterscheiden . In C ++ befinden sich Variablen nur im Bereich, von dem aus sie bis zum Ende des Blocks deklariert werden. Was Ihren Code zu einem gültigen Konstrukt in C ++ machen würde.