Diğer

C# 14 extension member'ları: derleyicinin uyarmadığı gölgeleme hatası

C# 14 ile gelen extension member sözdizimi, property ve static member'ları da kapsayacak şekilde genişledi; ancak bir tipin kendi member'ı aynı isimli extension member'ı sessizce gölgeliyor. Yazar, .NET 10 SDK üzerinde 8 testle bunu yeniden üretiyor: build 0 uyarı, 0 hata veriyor ama tüm çağrı noktaları farklı mantığa sahip gerçek member'a kayıyor.

DEV Community: #csharp Adrián Bailador
Yayın tarihi
Okuma süresi
10 dk okuma
agent çalıştırması #20
agent çalıştırması #20
Orijinale git dev.to

Bu haberi bildir

Özette bir hata mı var, ya da bu içeriğin sahibi misin? Mesajın doğrudan bana e-posta olarak gelir.

Mesaj türü

Kilit noktalar

  • Gerçek bir member, aynı isimli extension member'ı her zaman sessizce yener; derleyici ne uyarı ne hata üretir (.NET 10 SDK'da doğrulandı).
  • İki ayrı extension bloğu aynı ismi tanımlarsa derleme CS9339 ile durur; tehlikeli olan taraf extension ile gerçek member çakışması.
  • Extension property'ler expression tree içinde kullanılamaz: EF Core `Where` predicate'i CS9296 ile derleme zamanında patlar.
  • Static extension member çağrısı gerçek static member'dan ayırt edilemez; NuGet paketi sonradan aynı ismi eklerse kod sessizce ona kayar.
  • Korunma yolu: extension'ın döndürdüğü değeri doğrulayan test yazmak ve yeni member ekleyen diff'leri isim çakışması için gözden geçirmek.
  • `this` parametreli klasik extension method'lar ile extension blokları aynı IL'e derlenir; geçiş kademeli yapılabilir.

C# 14'te `extension(Order order)` bloğu ile bir tipin instance ve static method'ları, property'leri ve operatörleri tanımlanabiliyor. Yazarın yeniden ürettiği senaryoda ekip, paylaşılan `Order` record'una `IsEligibleForFreeShipping` adında bir extension property ekliyor. Haftalar sonra başka bir geliştirici aynı kuralı gerçek bir member olarak `Order` üzerine taşıyor ve mantığı da değiştiriyor. PR temiz bir şekilde merge oluyor, CI yeşil kalıyor, build 0 uyarı veriyor; fakat eski extension property artık hiçbir zaman çalışmıyor.

Kural yeni değil: bir tipin kendi member'ı her zaman aynı imzalı extension'ı yener ve bunun için derleyici bir teşhis üretmez. C# 14'te fark, bu kuralın yöntemlerin ötesine geçip property ve static member'lara uzanması; `Order.Empty(...)` çağrısı gerçek bir static member'dan mı geldiği ayırt edilemiyor. İki extension bloğunun çakışması ise CS9339 ile, expression tree içinde extension property kullanımı CS9296 ile derleme zamanında yakalanıyor.

Gerçek dünyada kullanımı

  • Üç servis arasında paylaşılan ve doğrudan değiştirilemeyen bir domain record'una promosyon veya hesaplama kuralı eklemek.
  • Kendi sahip olmadığınız bir NuGet tipine (sealed veya BCL) API katmanına özel mapping yardımcıları eklemek.
  • EF Core sorgularında kullanılacak hesaplanmış alanları, CS9296'ya takılmamak için gerçek instance member olarak yazmak.
  • Extension method'ları C# 14 sözdizimine taşırken aynı IL'e derlendiğini bildiğiniz için dosya dosya ilerlemek.

Neden önemli

Build çıktısında hiçbir iz bırakmadan çalışan kodu başka bir mantığa kaydırdığı için, extension property ve static member'ları gerçek member isimleriyle çakışabilecek şekilde kullanmak sessiz bir regresyon riski taşıyor.

Bu özet, DEV Community: #csharp üzerindeki orijinal yazıdan agent tarafından üretildi. Yazının tamamı ve tüm hakları ilgili yazara/yayıncıya aittir. Orijinal yazıya git

Benzer haberler

Geri bildirim

Bir hata mı buldun, bir fikrin mi var? Yazdığın mesaj doğrudan bana e-posta olarak gelir.

Mesaj türü