Mengapa kompiler C # memungkinkan variabel digandakan dalam lingkup bersarang?

18

Secara historis, ketika berkembang di .Net saya tidak bisa menduplikasi nama variabel dalam lingkup bersarang. Namun, setelah baru-baru ini memperbarui Visual Studio 2019 ke versi 16.4.2 saya perhatikan bahwa nama variabel dapat diduplikasi dalam lingkup bersarang.

Sebagai contoh:

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

Mengapa ini tiba-tiba diizinkan?

Pertanyaan tindak lanjut: Jika ini adalah "fitur" bahasa baru, apakah ada cara untuk mengkonfigurasi Visual Studio untuk terus istirahat ketika variabel diduplikasi dalam lingkup bersarang?

masterjeef
sumber
2
Saya tidak berpikir itu memungkinkan duplikat variabel. menggunakan testvariabel yang sama karena tipe data sama. coba mendeklarasikan testvariabel sebagai int contoh. var test = 12345;saya pikir Anda harus mendapatkan kesalahan kompilasi. (Saya belum mencobanya)
LP13
1
@ LP13 Mengubah tipe testseperti yang disarankan tidak berpengaruh. Anda dapat mencobanya di Fiddle yang ditautkan dalam pertanyaan.
Amy
1
Namun, kerangka kerja target tidak relevan. Perilaku baru ini disebabkan oleh versi bahasa. Kode mengkompilasi pada C # 8, tidak mengkompilasi pada C # 7.3 (dan saya kira di bawah ini)
Emanuel Vintilă
6
Ada masalah GitHub untuk itu. Tonggak sejarah diatur ke 16.5. @OrkhanAlikhanov Anda menemukannya lebih cepat :)
Pavel Anikhouski

Jawaban:

1

Ini adalah fitur baru di C # 8.0, fungsi lokal dan parameter lambda dapat membayangi nama luar.

Sebastian 506563
sumber
0

tebakan saya adalah bahwa fungsi pilih sedang dikompilasi sebagai statis karena tidak memiliki koneksi ke tubuh metode host. itu hanya mencetak dan mengembalikan item yang dimaksud. ini tidak memerlukan akses apa pun ke metode dan karena itu, alasan pengoptimalan dapat dipindahkan dari badan metode dan diletakkan sendiri dalam lingkup global.

dan dalam hal ini, variabel uji itu adalah variabelnya sendiri dan tidak memiliki koneksi ke variabel tes di atas.

untuk mencegah hal ini, Anda tidak bisa meminta vs untuk melemparkan kesalahan saat itu terjadi, Anda hanya perlu mengubah nama variabel secara manual.

Bailey Drahoss
sumber