Warum erlaubt der C # -Compiler eine duplizierte Variable im verschachtelten Bereich?

18

In der Vergangenheit konnte ich bei der Entwicklung in .Net den Namen der Variablen im verschachtelten Bereich nicht duplizieren. Nach der kürzlich erfolgten Aktualisierung von Visual Studio 2019 auf Version 16.4.2 habe ich jedoch festgestellt, dass Variablennamen im verschachtelten Bereich dupliziert werden können.

Zum Beispiel:

var test = "hello";
Console.WriteLine(test);
var things = new []{"one", "two", "three"};
things.Select(test => // <- test is duplicated here, normally this breaks compilation
{
    Console.WriteLine(test);
    return test;
}).ToList();

// output:
// hello
// one
// two
// three

https://dotnetfiddle.net/h85BK4

Warum ist das plötzlich erlaubt?

Folgefrage: Wenn dies eine neue Sprachfunktion ist, gibt es eine Möglichkeit, Visual Studio so zu konfigurieren, dass es weiterhin unterbrochen wird, wenn eine Variable im verschachtelten Bereich dupliziert wird?

masterjeef
quelle
2
Ich glaube nicht, dass es doppelte Variablen erlaubt. Es wird dieselbe testVariable verwendet, da der Datentyp gleich ist. Versuchen Sie, die testVariable als int z. var test = 12345;Ich denke, Sie sollten Kompilierungsfehler bekommen. (Ich habe es nicht versucht)
LP13
1
@ LP13 Das Ändern des Typs testwie vorgeschlagen hat keine Auswirkung. Sie können es in der in der Frage verlinkten Geige versuchen.
Amy
1
Trotzdem ist das Ziel-Framework irrelevant. Das neue Verhalten ist auf die Sprachversion zurückzuführen. Der Code wird auf C # 8 kompiliert, nicht auf C # 7.3 (und darunter nehme ich an)
Emanuel Vintilă
6
Dafür gibt es ein GitHub- Problem . Der Meilenstein ist auf 16,5 festgelegt. @OrkhanAlikhanov du hast es schneller gefunden :)
Pavel Anikhouski

Antworten:

1

Dies ist eine neue Funktion in C # 8.0. Lokale Funktionen und Lambda-Parameter können äußere Namen beschatten.

Sebastian 506563
quelle
0

Ich vermute, dass die Auswahlfunktion als statisch kompiliert wird, da sie keine Verbindungen zum Hauptteil der Hostmethode hat. Es druckt nur den betreffenden Artikel und gibt ihn zurück. Dies erfordert keinen Zugriff auf die Methode und kann daher aus Optimierungsgründen aus dem Methodenkörper verschoben und innerhalb des globalen Bereichs eigenständig platziert werden.

und in diesem Fall ist diese Testvariable ihre eigene Variable und hat keine Verbindungen zu der obigen Testvariablen.

Um dies zu verhindern, können Sie vs nicht anweisen, einen Fehler auszulösen, wenn dieser auftritt. Sie müssen lediglich den Variablennamen manuell ändern.

Bailey Drahoss
quelle