Kind-Bereich & CS0136
Den folgenden code zu kompilieren, schlägt fehl, die besagt "Eine lokale variable mit dem Namen 'st' deklariert werden können, in diesem Umfang, da würde es eine andere Bedeutung geben 'st', die bereits in ein "Kind" Bereich zu bezeichnen, dass etwas anderes":
var l = new List<string>();
l.Find(st => st.EndsWith("12"));
string st = "why this fails?";
Verstehe ich, warum dies nicht funktioniert:
string preParent = "";
{
string preParent = "Should fail cause we change the meaning";
}
Wenn wir die bekommen wir "CS0103: Der name 'postParent' existiert nicht im aktuellen Kontext":
{
string postParent=string.Empty;
}
postParent = "Should this work?";
Was ich nicht verstehe ist, warum ist der compiler schlau genug, um zu sehen, dass postParent ist nicht im Umfang, aber nicht lassen Sie mich eine neue variable definieren, die denselben Namen hat wie eine variable in einem untergeordneten Bereich (was offensichtlich aus dem Rahmen an dieser Stelle).
Ist der compiler, der einfachen Durchsetzung Umfang durch die Weigerung, lassen Sie mich mit der Variablen? Wenn ja, das macht Sinn.
===========
Bearbeitet:
Ich denke, was ich auch interessant finde, ist wie Sie können die gleiche variable innerhalb von zwei untergeordnete Bereiche in eine einzelne Methode, so gilt:
{
string thisWorks= string.Empty;
}
{
string thisWorks= "Should this work?";
}
Ich bin nur ein wenig neugierig, dass Sie können zwei Variablen mit dem gleichen Namen, solange Sie auf dem gleichen Niveau (wenn man sich als Umfang eines Baumes). Dies macht Sinn, denn Sie können lokale Variablen, die in beiden Methoden der gleichen Klasse mit dem gleichen Namen.
Ich bin nur überrascht, dass der compiler in der Lage ist zu differenzieren und dies erlauben, während Sie würde nicht zulassen, dass die postParent variable. Und dies ist eine technische Einschränkung, oder war dies eine design-Entscheidung? Das ist, was ich wirklich erreichen wollte;-)
- Warum downvote nach 5 Monaten jetzt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, der compiler ist die Durchsetzung Umfang. Beachten Sie, dass der Gültigkeitsbereich einer Variablen ist der lexikalische block es ist ein Teil - nicht nur aus der Sicht der Erklärung ab, sondern den ganzen Umfang.
Der compiler beschwert sich, weil die Zuordnung zu
postParent
ist außerhalb Ihrer Reichweite (die nur die geschachtelte Klammern). Wenn Sie versucht haben, deklarieren Sie eine neue variable an der Stelle, wo Sie gerade die Zuordnung zupostParent
wäre das problem mit dem verschachtelten block, weil der Umfang derpostParent
würde gehören, dass der verschachtelte block, obwohl es schon vor der Erklärung.Bereiche sind beschrieben in Abschnitt 3.7 der C# - 3.0-Spezifikation.
EDIT: Um auf Ihre Frage Antworten Bearbeiten.
Es nur zwei einfache Regeln:
Ich bin mir sicher, dass Sie die Sprache konnte wurden so konstruiert, dass der Umfang begann erst an dem Punkt der Erklärung, aber ich denke, es ist einfacher (in Bezug auf Sprache, Komplexität) zu berücksichtigen Bereiche als nur blocks - also alle lokalen Variablen, die in dem gleichen block haben die gleiche Bedeutung, zum Beispiel. Das macht das Leben viel einfacher, wenn man bedenkt erfassten Variablen auch - wie das, was eingefangen wird, hängt vom Umfang und geschachtelte scopes machen das Leben interessant...
EDIT: die Sprache, Die Skillung hat dies zu sagen über die ursprüngliche lambda-Ausdruck Beispiel - es ist Abschnitt 7.14.1:
Hilft das?
preParent
Beispiel in diesem Fall.Sind Sie eine variable deklarieren in einem begrenzten Umfang und zu versuchen, es außerhalb dieses Bereichs. Der compiler davon ausgegangen, dass Sie nicht wollen, Zugang zu es so Sie deklarieren eine variable mit dem gleichen Namen irgendwo anders in der Datei. Ihr versucht zu tun, die alten C-trick, vorausgesetzt die variable wird sofort live außerhalb des Geltungsbereichs. Zum Beispiel diese verwendet, um die Arbeit in älteren Versionen von C/C++, aber nicht mehr.