Dlaczego kompilator C # pozwala na powielanie zmiennych w zagnieżdżonym zakresie?

18

Historycznie, podczas programowania w .Net nie mogłem powielić nazwy zmiennej w zagnieżdżonym zakresie. Jednak po niedawnej aktualizacji programu Visual Studio 2019 do wersji 16.4.2 zauważyłem, że nazwy zmiennych można powielać w zakresie zagnieżdżonym.

Na przykład:

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

Dlaczego jest to nagle dozwolone?

Dalsze pytanie: jeśli jest to „funkcja” nowego języka, czy istnieje sposób na skonfigurowanie programu Visual Studio, aby kontynuował łamanie, gdy zmienna jest duplikowana w zakresie zagnieżdżonym?

masterjeef
źródło
2
nie sądzę, że zezwala na powielanie zmiennych. używa tej samej testzmiennej, ponieważ typ danych jest taki sam. spróbuj zadeklarować testzmienną jako int np. var test = 12345;myślę, że powinieneś dostać błąd kompilacji. (Nie próbowałem tego)
LP13
1
@ LP13 Zmiana typu testzgodnie z sugestią nie ma wpływu. Możesz spróbować w skrzypce połączonym w pytaniu.
Amy
1
Niemniej jednak ramy docelowe nie mają znaczenia. Nowe zachowanie wynika z wersji językowej. Kod kompiluje się w C # 8, nie kompiluje się w C # 7.3 (i zakładam, że poniżej)
Emanuel Vintilă
6
Jest z tym problem GitHub . Kamień milowy jest ustawiony na 16,5. @OrkhanAlikhanov znalazłeś to szybciej :)
Pavel Anikhouski

Odpowiedzi:

1

Jest to nowa funkcja w C # 8.0, funkcja lokalna i parametry lambda mogą ukrywać nazwy zewnętrzne.

Sebastian 506563
źródło
0

domyślam się, że funkcja select jest kompilowana jako statyczna, ponieważ nie ma żadnych połączeń z treścią metody hosta. po prostu drukuje i zwraca przedmiotowy przedmiot. nie wymaga to dostępu do metody i jako takie może być ze względów optymalizacyjnych przeniesione z treści metody i samodzielnie wprowadzone w zakres globalny.

iw tym przypadku ta zmienna testowa jest własną zmienną i nie ma powiązań z powyższą zmienną testową.

Aby temu zapobiec, nie możesz powiedzieć vs, aby wygenerował błąd, gdy wystąpi, wystarczy ręcznie zmienić nazwę zmiennej.

Bailey Drahoss
źródło