/ / Warum kann ich keine Variable mit demselben Namen in verschiedenen Bereichen in C # deklarieren? [Duplikat] - c #, Umfang

Warum kann ich eine Variable mit demselben Namen in verschiedenen Bereichen in C # nicht deklarieren? [Duplikat] - c #, Umfang

Ich bin mir nicht sicher, ob dies der Fall ist, weil der C # -Compiler besonders wählerisch ist, aber ich versuche dies in C #:

public static void Main()
{
bool result = true; // some dummy value
if(result)
{
int x = 5;
Console.WriteLine(x);
}

int x = 10;
Console.WriteLine(x);
}

Der Compiler beschwert sich, dass der Variablenname "x" bereits verwendet wird:

Eine lokale Variable mit dem Namen "x" kann in diesem Bereich nicht deklariert werden würde "x" eine andere Bedeutung geben, die bereits in a verwendet wird "Kind" kann etwas anderes bezeichnen.

Und ich verstehe, dass es der Meinung ist, dass es sich um ein Problem handelt, aber warum glaubt es das?

Wenn ich denselben Code in Java reproduziere, gibt es keine Probleme.

Antworten:

1 für die Antwort № 1

Nicht jeder {} beginnt einen neuen Bereich. Die im if-Block deklarierte Ganzzahl befindet sich noch im selben Stack wie die Funktion.


1 für die Antwort № 2

Von MSDN Compilerfehler CS0136

Für jedes Vorkommen eines bestimmten Bezeichners alseinfacher Name in einem Ausdruck oder Deklarator im Deklarationsraum der lokalen Variablen (§3.3), die dieses Ereignis unmittelbar einschließt, jedes andere Ereignis desselben Bezeichners als einfacher Name in einem Ausdruck oder Deklarator muss sich auf dieselbe Entität beziehen. Diese Regel stellt sicher, dass die Bedeutung von a Name ist innerhalb eines gegebenen Blocks immer derselbe, Switch-Block, für-, foreach- oder using-Anweisung oder anonyme Funktion.

Als zweite Referenz prüfen Variabler Gültigkeitsbereich in C # Antworten, in denen Sie gute Informationen finden können.

Sie dürfen denselben Variablennamen in verwendennicht überlappend Bereiche. Wenn ein Bereich jedoch einen anderen Bereich überlappt, können Sie das nicht haben gleiche Variable in beiden deklariert. Der Grund dafür ist, Sie zu verhindern versehentlich Verwendung eines bereits verwendeten Variablennamens in einem inneren Umfang


1 für die Antwort № 3

Wie @BlackFrog richtig darauf hinweist, jeder { } startet keinen neuen Bereich. Aus der C # -Sprachenspezifikation, §3.3:

• Jeder Methodendeklaration, Indexer-Deklaration, Betreibererklärung, Instanzkonstruktor-Deklaration und anonyme Funktion erstellt einen neuen Deklarationsraum namens a Deklarationsraum für lokale Variablen. In diese Deklaration werden Namen eingefügtPlatz durch formale Parameter (feste Parameter und Parameter-Arrays) und Typ-Parameter. Der Hauptteil des Funktionsmitglieds oder der anonymen Funktion wird, falls vorhanden, als verschachtelt im Deklarationsbereich der lokalen Variablen betrachtet. Es ist ein Fehler für einen Deklarationsbereich für lokale Variablen und für einen verschachtelten Deklarationsbereich für lokale Variablen, der Elemente mit demselben Namen enthält.

(Hervorhebung von mir)


0 für die Antwort № 4

Ich denke, es ist offensichtlicher, warum, wenn Sie die äußere Erklärung von verschieben x über der if-Anweisung.

public static void Main()
{
bool result = true; // some dummy value

int x = 10;

if(result)
{
//references x in parent scope
x = 5;
//x is already defined, can"t define again
int x = 5;
Console.WriteLine(x);
}

Console.WriteLine(x);
}

Klar würde der Compiler sehen x als eine Variable, die bereits in der if-Anweisung definiert ist, wenn der Code versucht, sie erneut zu deklarieren.