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.
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.
Benzer haberler
- .NET 10 + Pinecone: vektör veritabanı entegrasyonuDEV Community: #dotnet1 gün önce
- C#'ta LLM token'ları: yapay zekâ "strawberry"deki r'leri neden sayamıyor?DEV Community: #csharp1 gün önce
- C# interface'lerinde collection dönüş tipleri: interface, view ve snapshot farkıNick Cosentino (Dev Leader)2 gün önce