2 Stimmen

Warum kann ich nicht die Variable mit demselben Namen deklarieren, die bereits deklariert wurde, aber die neue Variable liegt außerhalb des Bereichs der anderen Variablen

private void Abc()
{
    string first="";
    ArrayList result = new ArrayList();
    ArrayList secResult = new ArrayList();
    foreach (string second in result)
    {
        if (first != null)
        {
            foreach (string third in secResult)
            {
                string target;
            }
        }

        string target;//Here I cannot decalre it. And if I don't declare it and
        //want to use it then also I cannot use it. And if it is in if condition like
        //the code commented below, then there is no any complier error.
        //if (first != null)
        //{
        //    string target;
        //}
    }
}

Ich kann das nicht verstehen: Warum kann ich die Variable nicht außerhalb der Tabelle deklarieren? foreach Schleife, da der Compiler die Fehlermeldung ausgibt, dass die Variable bereits deklariert ist. Der Anwendungsbereich der foreach (und damit die target Variable) ist dort, wo ich diese neue Variable deklariere.

9voto

Jon Skeet Punkte 1325502

En Umfang einer lokalen Variablen reicht bis zum Beginn des Blocks, in dem sie deklariert wurde. Daher erstreckt sich der Geltungsbereich Ihrer zweite Deklaration als eigentlich die Gesamtheit der äußeren foreach Schleife. Aus der C# 4 Spezifikation, Abschnitt 3.7:

Der Geltungsbereich einer lokalen Variable, die in einer lokalen Variablen-Deklaration (§8.5.1) deklariert wurde, ist der Block, in dem die Deklaration stattfindet.

und in Abschnitt 8.5.1:

Der Geltungsbereich einer lokalen Variable, die in einer lokalen Variablen-Deklaration deklariert wird, ist der Block, in dem die Deklaration stattfindet. Es ist ein Fehler, auf eine lokale Variable an einer Textstelle zu verweisen, die vor dem local-variable-declarator der lokalen Variable liegt. Innerhalb des Geltungsbereichs einer lokalen Variable ist es ein Kompilierzeitfehler, eine andere lokale Variable oder Konstante mit demselben Namen zu deklarieren.

Obwohl die zweite Variable nicht an der Stelle deklariert wurde, an der die erste Variable auftritt, ist sie immer noch im Geltungsbereich - die beiden Deklarationen zwischen ihnen verstoßen also gegen 8.5.1.

Die Sprache wurde auf diese Weise konzipiert, um Fehler zu vermeiden - es wäre seltsam, wenn die Deklaration einer lokalen Variable einfach verschoben würde innerhalb des Blocks, in dem er deklariert wird und vor seiner ersten Verwendung die Gültigkeit des Codes geändert.

2voto

V4Vendetta Punkte 35598

Das liegt daran, dass die zweite Erklärung für die den gesamten Anwendungsbereich der Methode Umfang der ersten foreach Schleife, die die zweite foreach Schleife, die in der Methode enthalten ist. Sie müssen also den Bereich der anderen Zeichenfolge mit geschweiften Klammern einschränken

{
string target .....
}

Nun, dies sollte nicht wirklich erforderlich sein und scheint wie ein Zeichen von Code Geruch, vielleicht müssen Sie die Logik in separate Methoden zu kapseln. ich würde Sie bitten, den Code erneut zu überprüfen und sehen, ob es rekonstruiert werden könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X