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%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.
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.
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.