Neden C # derleyicisi iç içe kapsamda yinelenen bir değişkene izin veriyor?


18

Tarihsel olarak, Net I geliştirirken olamazdı iç içe kapsamında değişkenin adını yinelenen. Ancak, son zamanlarda Visual Studio 2019'u 16.4.2 sürümüne güncelledikten sonra, değişken adlarının iç içe kapsamda çoğaltılabileceğini fark ettim.

Örneğin:

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

Buna neden birden izin verilir?

Takip eden soru: Bu yeni bir dil "özelliği" ise, Visual Studio'yu bir değişken iç içe kapsamda çoğaltıldığında kırılmaya devam edecek şekilde yapılandırmanın bir yolu var mı?


2
onun yinelenen değişken izin vermez sanmıyorum. testveri türü aynı olduğundan aynı değişkeni kullanıyor . ilan deneyin testolarak değişken int örn. var test = 12345;Sanırım derleme hatası almalısın. (Ben denemedim)
LP13

1
@ LP13 Önerildiği testgibi tipinin değiştirilmesinin bir etkisi yoktur. Soruyu bağlantılı Fiddle'da deneyebilirsiniz.
Amy

1
Boşver, hedef çerçeve önemsiz. Yeni davranış dil sürümüne bağlıdır. Kod C # 8'de derlenir, C # 7.3'te derlenmez (ve sanırım aşağıda)
Emanuel Vintilă


6
Bunun için GitHub sorunu var. Kilometre taşı 16.5 olarak ayarlanmıştır. @OrkhanAlikhanov daha hızlı
buldun

Yanıtlar:


1

Bu C # 8.0 yeni bir özellik, yerel işlevi ve lambda parametreleri dış isimleri gölgelendirebilir.


0

benim tahminim, select fonksiyonunun host metodu gövdesine bağlantısı olmadığı için statik olarak derlenmesidir. sadece söz konusu öğeyi yazdırır ve döndürür. bu, yönteme herhangi bir erişim gerektirmez ve bu nedenle, optimizasyon nedenlerinden ötürü yöntem gövdesinin dışına çıkarılabilir ve küresel kapsam dahilinde tek başına kullanılabilir.

ve bu durumda, bu test değişkeni kendi değişkendir ve yukarıdaki test değişkenine bağlantısı yoktur.

Bunu önlemek için, vs'ye bir hata oluştuğunda atmasını söyleyemezsiniz, sadece değişken adını manuel olarak değiştirmeniz gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.