Welchen Umfang hat die Zählervariable in einer for-Schleife?

9

Ich erhalte den folgenden Fehler in Visual Studio 2008:

Error 1 A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

Das ist mein Code:

%Vor%

Ich verstehe, dass str nicht mehr existiert, wenn die Schleife beendet ist, aber ich dachte auch, dass der Umfang von i ebenfalls auf die for -Schleife beschränkt ist.

So hat i den gleichen Gültigkeitsbereich wie eine Variable, die direkt außerhalb der for Schleife deklariert wurde?

Bearbeiten:

Nur um klar zu sein, ich benutze C #. Ich diskutiere über das Entfernen des "C" -Tags. Da jedoch die richtige Antwort den Unterschied zwischen den beiden erklärt, halte ich es für sinnvoll, beide Tags zu belassen.

Ich hatte einen Fehler in meinem obigen Code-Kommentar:

%Vor%     
JohnB 06.08.2010, 18:47
quelle

4 Antworten

19

Ich denke, du verwirrst C ++ und C #.

In C ++ war es üblich, dass der Gültigkeitsbereich einer Variablen, die in einem for-Ausdruck deklariert wurde, außerhalb des Blocks lag, der darauf folgte. Dies wurde vor einiger Zeit geändert, so dass der Gültigkeitsbereich einer Variablen, die in einem for-Ausdruck deklariert wurde, für den nachfolgenden Block intern war. C # folgt diesem späteren Ansatz. Aber nichts hat damit zu tun.

Hier geht es darum, dass C # einem Bereich nicht erlaubt, eine Variable mit demselben Namen in einem äußeren Bereich auszublenden.

In C ++ war das früher illegal. Jetzt ist es legal.

%Vor%

Und das Gleiche ist legal in C #. Es gibt drei Bereiche, den äußeren, in dem "i" nicht definiert ist, und zwei untergeordnete Bereiche, von denen jeder sein eigenes "i" deklariert.

Aber was du tust ist das:

%Vor%

Hier gibt es zwei Bereiche. Ein Äußeres, das ein "Ich" erklärt, und ein Inneres, das auch ein "Ich" erklärt. Das ist legal in C ++ - das äußere 'i' ist versteckt - aber in C # ist es illegal, unabhängig davon, ob der innere Bereich eine for-Schleife, eine while-Schleife oder was auch immer ist.

Versuchen Sie Folgendes:

%Vor%

Es ist das gleiche Problem. C # lässt in verschachtelten Bereichen keine Variablen mit demselben Namen zu.

    
Jeff Dege 06.08.2010, 19:02
quelle
3

Der Incrementor existiert nach der for-Schleife nicht.

%Vor%

Der Grund, warum Sie i nach der for-Schleife nicht neu deklarieren können, ist, dass es in der IL es vor der for-Schleife deklariert, weil Deklarationen am oberen Rand des Bereichs auftreten.

    
Jimmy Hoffa 06.08.2010 18:54
quelle
2

Ja. Syntaktisch: Der neue Bereich befindet sich innerhalb des durch die geschweiften Strings definierten Blocks. Funktionell: Es gibt Fälle, in denen Sie den endgültigen Wert der Schleifenvariablen überprüfen möchten (z. B. wenn Sie einen Fehler machen).

    
Nicolas78 06.08.2010 18:50
quelle
2

Nur ein paar Hintergrundinformationen: Die Sequenz kommt nicht dazu. Es gibt nur die Idee von Bereichen - der Anwendungsbereich der Methode und dann der Umfang der for -Schleife. Daher ist "wenn die Schleife endet" nicht korrekt.

Du postest also liest das gleiche wie folgt:

%Vor%

Ich finde, dass das Nachdenken darüber die Antworten in meinem mentalen Modell "besser" macht.

    
Kieren Johnstone 06.08.2010 18:51
quelle

Tags und Links