Frage

Der folgende Code schlägt fehl „Eine lokale Variable mit dem Namen‚st‘zu kompilieren besagt, kann nicht in diesem Umfang deklariert werden, weil es eine andere Bedeutung zu‚st‘geben würde, die bereits in einem‚Kind‘Umfang verwendet wird, etwas anderes zu bezeichnen „:

        var l = new List<string>();
        l.Find(st => st.EndsWith("12"));
        string st = "why this fails?";

Ich verstehe, warum dies nicht funktionieren:

        string preParent = "";
        {
            string preParent = "Should fail cause we change the meaning";
        }

Wenn wir das tun die folgend wir „CS0103: Der Name‚postParent‘nicht im aktuellen Kontext existiert“: get

        {
            string postParent=string.Empty;
        }
        postParent = "Should this work?";

Was ich nicht bekommen ist, warum der Compiler ist intelligent genug, um zu sehen, dass postParent nicht innerhalb des Bereichs ist, sondern mir eine neue Variable nicht zulassen, definieren, die den gleichen Namen wie eine Variable innerhalb eines Kindes Umfang eingesetzt hat (die out of scope ist offensichtlich an dieser Stelle).

Ist der Compiler einfach Erzwingen Umfang durch die Weigerung, mir die Variable verwenden zu lassen? Wenn dies der Fall ist dies sinnvoll.

===========

Editiert:

Ich denke, was ich auch interessant finde, ist, wie Sie die gleiche Variable innerhalb von zwei untergeordneten Bereichen in einem einzigen Verfahren haben können, so das gilt:

        {
            string thisWorks= string.Empty;
        }
        {
            string thisWorks= "Should this work?";
        }

Ich bin nur ein wenig merkwürdig, dass Sie zwei Variablen mit dem gleichen Namen haben können, solange sie auf dem gleichen Niveau ist (wenn man sich Umfang aussehen wie ein Baum). Dies macht Sinn, weil Sie lokale Variablen in zwei Methoden der gleichen Klasse mit dem gleichen Namen haben können.

Ich bin nur überrascht, dass der Compiler in der Lage ist, dies zu differenzieren und erlauben, während es der postParent Variable nicht zulassen würde. Und das ist eine technische Einschränkung oder war dies eine Design-Entscheidung? Das ist, was ich wirklich bin versucht zu bekommen; -)

War es hilfreich?

Lösung

Ja, der Compiler erzwingt Umfang. nicht nur unter dem Gesichtspunkt der Erklärung ab, aber der ganze Umfang - es ist Teil des Hinweis, dass der Umfang einer Variablen den lexikalische Block ist.

Der Compiler beschwert sich, weil die Zuordnung zu postParent außerhalb ihres Anwendungsbereichs ist (die nur die verschachtelten Klammern ist). Wenn Sie versucht eine neue Variable an der Stelle zu erklären, wo Sie gerade zuweisen, das Problem postParent würde mit dem verschachtelten Block sein, weil der Umfang der postParent dass verschachtelten Block umfassen würde, auch wenn es vor der Erklärung war.

Umfänge sind in Abschnitt 3.7 der C # 3.0-Spezifikation.

EDIT:. Um auf Ihre Frage bearbeiten antworten

Es ist nur zwei einfache Regeln:

  • Sie können eine lokale Variable deklarieren, wenn eine andere lokale Variable mit dem gleichen Namen im Umfang ist
  • der Umfang einer lokalen Variablen ist der Block, in dem die Deklaration erfolgt

Ich bin sicher, dass die Sprache so ausgelegt werden könnte, dass der Umfang nur an der Stelle der Erklärung begann, aber ich denke, es ist einfacher (in Bezug auf die Sprache Komplexität) Bereiche als nur ein paar Blocks zu betrachten - so alle lokalen Variablen deklariert in der gleiche Block hat den gleichen Umfang, zum Beispiel. Das macht das Leben viel einfacher, wenn erfaßt Variablen Berücksichtigung, auch - wie das, was gefangen genommen wird auf dem Umfang abhängt, und verschachtelte Bereiche machen das Leben interessant ...

EDIT: Die Sprache spec hat dies über das ursprüngliche Lambda-Ausdruck Beispiel zu sagen - es ist Abschnitt 7.14.1:

  

Die optionale   anonymous-Funktion-Signatur ein   anonyme Funktion definiert die Namen   und gegebenenfalls die Art der formalen   Parameter für die anonyme Funktion.   Der Umfang der Parameter der   anonyme Funktion ist die   anonymous-Funktion Körper. Zusammen mit   die Parameterliste (falls gegeben), das   anonyme-Methodenkörper bildet ein   Deklarationsraum. Aus diesem Grunde ist es   ist ein Fehler bei der Kompilierung für den Namen   ein Parameter der anonymen   Funktion den Namen eines lokalen anzupassen   Variable, lokale Konstante oder Parameter   deren Umfang umfasst die   anonymous-Verfahren Expression oder   Lambda-Ausdruck.

Ist diese Hilfe?

Andere Tipps

Sie deklarieren eine Variable in einem begrenzten Umfang und zu versuchen, es außerhalb dieses Bereichs zu verwenden. Der Compiler vorausgesetzt, dass Sie keinen Zugriff auf sie wollen, so dass Sie woanders in der Datei eine Variable mit dem gleichen Namen erklären können. Ihr Versuch, den alten C Trick anzunehmen, um die Variable zu tun unmittelbar außerhalb des Bereichs lebt. Zum Beispiel verwendet, um dieses in älteren Versionen von C / C ++ zu arbeiten, aber nicht mehr der Fall ist.

for (int i=0; i<10; i++)
{
    cout <<”In the loop i is “<< i << endl;
}
cout << “outside of the loop i is “ << i << endl; //this only compiles with old C/C++ compilers.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top