Bu kod neden çalışıyor? Visual Studio 2019 ile C # 8 kullanıyorum.
Kendi sorunuzu cevapladınız! Çünkü C # 8 kullanıyorsunuz.
C # 1'den 7'ye kadar olan kural şuydu: Basit bir ad, aynı yerel kapsamda iki farklı anlama gelmek için kullanılamaz. (Gerçek kural bundan biraz daha karmaşıktı, ancak nasıl sıkıcı olduğunu açıklıyor; ayrıntılar için C # spesifikasyonuna bakın.)
Bu kuralın amacı, örneğinizde bahsettiğiniz, yerelin anlamı hakkında karıştırılmanın çok kolay olduğu bir tür durumu önlemekti. Özellikle, bu kural aşağıdaki gibi karışıklıkları önlemek için tasarlanmıştır:
class C
{
int x;
void M()
{
x = 123;
if (whatever)
{
int x = 356;
...
Ve şimdi vücudunda özel bir durum nerede var M
, x
araçlar hem this.x
yerel x
.
İyi niyetli olmasına rağmen, bu kuralla ilgili bir takım sorunlar vardı:
- Şartnameye uygulanmadı. Basit bir adın hem tür hem de özellik olarak kullanılabileceği durumlar vardı, ancak hata algılama mantığı hatalı olduğu için bunlar her zaman hata olarak işaretlenmedi. (Aşağıya bakınız)
- Hata mesajları kafa karıştırıcı bir şekilde ifade edildi ve tutarsız bir şekilde rapor edildi. Bu durum için birden fazla farklı hata mesajı vardı. Suçluyu tutarsız bir şekilde tespit ettiler; yani bazen içsel kullanım, bazen dışsal ve bazen de kafa karıştırıcı olurdu.
Roslyn'de bunu çözmek için bir çaba harcadım; Bazı yeni hata mesajları ekledim ve eskilerini hatanın nerede bildirildiği konusunda tutarlı hale getirdim. Ancak, bu çaba çok az, çok geç oldu.
C # ekibi C # 8 için tüm kuralın önlediğinden daha fazla karışıklığa neden olduğuna karar verdi ve kural dilden emekliye ayrıldı. (Emekliliğin ne zaman gerçekleştiğini belirlediği için Jonathon Chase'e teşekkür ederiz.)
Bu sorunun tarihini ve nasıl düzeltmeye çalıştığımı öğrenmek istiyorsanız, bu konuda yazdığım şu makalelere bakın:
https://ericlippert.com/2009/11/02/simple-names-are-not-so-simple/
https://ericlippert.com/2009/11/05/simple-names-are-not-so-simple-part-two/
https://ericlippert.com/2014/09/25/confusing-errors-for-a-confusing-feature-part-one/
https://ericlippert.com/2014/09/29/confusing-errors-for-a-confusing-feature-part-two/
https://ericlippert.com/2014/10/03/confusing-errors-for-a-confusing-feature-part-three/
Üçüncü bölümün sonunda, bu özellik ile "Renk Rengi" özelliği - yani aşağıdakilere izin veren özellik arasında bir etkileşim olduğunu belirttim:
class C
{
Color Color { get; set; }
void M()
{
Color = Color.Red;
}
}
Burada Color
hem basit numarayı hem this.Color
de numaralandırılmış türü ifade etmek için kullandık Color
; spesifikasyonun sıkı bir şekilde okunmasına göre bu bir hata olmalıdır, ancak bu durumda spesifikasyon yanlıştı ve niyet izin vermekti, çünkü bu kod açık ve geliştiricinin değiştirmesini sağlamak için can sıkıcı olurdu.
Bu iki kural arasındaki garip etkileşimleri açıklayan bir makaleyi hiç yazmadım ve şimdi bunu yapmak biraz anlamsız olurdu!
x
bu yönteme ait tüm parametre kapsam dışına taşınır. Örnek için sharplab'a bakınız .