Uyumluluk kurallarını değiştirme
.NET, geçmişi boyunca sürümden sürüme ve .NET uygulamaları arasında yüksek düzeyde uyumluluk sağlamaya çalıştı. .NET Framework ile karşılaştırıldığında .NET 5 (ve .NET Core) ve sonraki sürümleri yeni bir teknoloji olarak kabul edilebilir, ancak iki önemli faktör bu .NET uygulamasının .NET Framework'ten ayrışma becerisini sınırlar:
Çok sayıda geliştirici başlangıçta .NET Framework uygulamaları geliştirmiş veya geliştirmeye devam ediyor. .NET uygulamalarında tutarlı bir davranış beklerler.
.NET Standart kitaplık projeleri, geliştiricilerin .NET Framework ve .NET 5 (ve .NET Core) ve sonraki sürümleri tarafından paylaşılan ortak API'leri hedefleyen kitaplıklar oluşturmasına olanak tanır. Geliştiriciler, .NET 5 uygulamasında kullanılan bir kitaplığın .NET Framework uygulamasında kullanılan kitaplıkla aynı şekilde davranmasını bekler.
Geliştiriciler. .NET uygulamaları arasındaki uyumluluğun yanı sıra, belirli bir .NET uygulamasının sürümleri arasında yüksek düzeyde uyumluluk bekler. Özellikle, .NET Core'un önceki bir sürümü için yazılmış kod .NET 5 veya sonraki bir sürümde sorunsuz bir şekilde çalıştırılmalıdır. Aslında, birçok geliştirici .NET'in yeni yayınlanan sürümlerinde bulunan yeni API'lerin bu API'lerin tanıtıldığı yayın öncesi sürümlerle de uyumlu olmasını bekler.
Bu makalede uyumluluğu ve .NET ekibinin her değişiklik türünü değerlendirme şeklini etkileyen değişiklikler özetlenmektedir. .NET ekibinin olası hataya neden olabilecek değişikliklere nasıl yaklaştığını anlamak, mevcut .NET API'lerinin davranışını değiştiren çekme isteklerini açan geliştiriciler için özellikle yararlıdır.
Aşağıdaki bölümlerde.NET API'lerinde yapılan değişikliklerin kategorileri ve bunların uygulama uyumluluğu üzerindeki etkileri açıklanmaktadır. Değişikliklere izin verilir (✔️), izin verilmez (❌) veya önceki davranışın () ne kadar öngörülebilir, belirgin ve tutarlı olduğu ❓ konusunda karar ve değerlendirme gerektirir.
Not
- Kitaplık geliştiricileri, .NET kitaplıklarındaki değişikliklerin nasıl değerlendirildiğini gösteren bir kılavuz olarak hizmet vermenin yanı sıra, birden çok .NET uygulamasını ve sürümünü hedefleyen kitaplıklarındaki değişiklikleri değerlendirmek için de bu ölçütleri kullanabilir.
- İleri ve geri uyumluluk gibi uyumluluk kategorileri hakkında bilgi için bkz . Kod değişiklikleri uyumluluğu nasıl etkileyebilir?
Genel sözleşmede yapılan değişiklikler
Bu kategorideki değişiklikler, bir türün genel yüzey alanını değiştirir. Bu kategorideki değişikliklerin çoğu geriye dönük uyumluluğu ihlal ettiğinden izin verilmiyor (API'nin önceki bir sürümüyle geliştirilen bir uygulamanın daha sonraki bir sürümde yeniden derleme olmadan yürütülebilmesi).
Türler
✔️ İzİn VERİlDİ: Arabirim zaten bir temel tür tarafından uygulandığında bir türdeki arabirim uygulamasını kaldırma
❓ YARGI GEREKTİRİR: Bir türe yeni arabirim uygulaması ekleme
Bu, mevcut istemcileri olumsuz etkilemediğinden kabul edilebilir bir değişikliktir. Türdeki tüm değişiklikler, yeni uygulamanın kabul edilebilir kalması için burada tanımlanan kabul edilebilir değişikliklerin sınırları içinde çalışmalıdır. Tasarımcının veya seri hale getiricinin alt düzeyde tüketilemeyen kod veya veri oluşturma becerisini doğrudan etkileyen arabirimler eklerken çok dikkatli olunması gerekir. Arabirime örnek olarak verilmiştir ISerializable .
❓ HÜKÜM GEREKTİRİR: Yeni bir temel sınıfa giriş
Yeni soyut üyeler sunmaz veya mevcut türlerin semantiğini veya davranışını değiştirmezse, mevcut iki tür arasındaki bir hiyerarşiye bir tür tanıtılabilir. Örneğin, .NET Framework 2.0'da sınıfı, DbConnection daha önce doğrudan öğesinden Componenttüretilmiş olan için SqlConnectionyeni bir temel sınıf haline geldi.
✔️ İzİn VERİlDİ: Türü bir derlemeden diğerine taşıma
Eski derleme, yeni derlemeye TypeForwardedToAttribute işaret eden ile işaret edilmelidir.
✔️ İzİn VERİlDİ: Yapı türünü tür olarak
readonly struct
değiştirmeTürün
readonly struct
tür olarak değiştirilmesinestruct
izin verilmez.✔️ İzİn VERİlDİ: Erişilebilir (genel veya korumalı) oluşturucular olmadığında bir türe korumalı veya soyut anahtar sözcüğü ekleme
✔️ İzİn VERİlDİ: Türün görünürlüğünü genişletme
❌İZIN VERilmeyen: Bir türün ad alanını veya adını değiştirme
❌İZIN VERilmeyen: Ortak türü yeniden adlandırma veya kaldırma
Bu, yeniden adlandırılan veya kaldırılan türü kullanan tüm kodları keser.
Not
Nadir durumlarda,.NET bir genel API'yi kaldırabilir. Daha fazla bilgi için bkz . .NET'te API kaldırma. hakkında bilgi için. NET'in destek ilkesi, bkz . .NET Destek İlkesi.
❌İZIN VERilmeyen: Sabit listesinin temel türünü değiştirme
Bu, derleme zamanı ve davranış hatalarının yanı sıra öznitelik bağımsız değişkenlerini ayrıştırılamaz hale getirebilecek ikili hataya neden olan bir değişikliktir.
❌İZIN VERilmeyen: Daha önce korumasız olan bir türü mühürleme
❌İZIN VERilmeyen: Bir arabirimin temel türleri kümesine arabirim ekleme
Bir arabirim daha önce uygulamadığı bir arabirim uygularsa, arabirimin özgün sürümünü uygulayan tüm türler bozulur.
❓ YARGILAMA GEREKTİRİSİ: Temel sınıflar kümesinden veya uygulanan arabirim kümesinden bir sınıfı kaldırma
Arabirimi kaldırma kuralında bir özel durum vardır: Kaldırılan arabirimden türetilen bir arabirimin uygulamasını ekleyebilirsiniz. Örneğin, türü veya arabirimini uygulayan IComponentve uygulayan IDisposableöğesini kaldırabilirsinizIDisposable.
❌İZIN VERilmeyen: Türü
readonly struct
yapı türüne değiştirmeAncak bir
struct
türün tür olarak değiştirilmesinereadonly struct
izin verilir.❌İZIN VERilmeyen: Yapı türünü tür
ref struct
olarak değiştirme (veya tam tersi)❌İZIN VERilmeyen: Türün görünürlüğünü azaltma
Ancak, bir türün görünürlüğünü artırmaya izin verilir.
Üyeler
✔️ İzİn VERİlDİ: Sanal olmayan bir üyenin görünürlüğünü genişletme
✔️ İzİn VERİlDİ: Erişilebilir (genel veya korumalı) oluşturucuları olmayan veya türü korumalı olan bir ortak türe soyut üye ekleme
Ancak, erişilebilir (genel veya korumalı) oluşturucuları olan ve izin verilmeyen
sealed
bir türe soyut üye eklemeye izin verilmez.✔️ İzİn VERİlDİ: Türün erişilebilir (genel veya korumalı) oluşturucuları olmadığında veya tür korumalı olduğunda korumalı üyenin görünürlüğünü kısıtlama
✔️ İzİn VERİlDİ: Bir üyeyi hiyerarşide kaldırıldığı türden daha yüksek bir sınıfa taşıma
✔️ İzİn VERİlDİ: Geçersiz kılma ekleme veya kaldırma
Geçersiz kılmaya giriş yapmak, önceki tüketicilerin temeli çağırırken geçersiz kılmayı atlamalarına neden olabilir.
✔️ İzİn VERİlDİ: Sınıfın daha önce oluşturucuları yoksa, bir sınıfa bir oluşturucu ve parametresiz oluşturucu ekleme
Ancak, daha önce parametresiz oluşturucu eklemeden oluşturucu içermeyen bir sınıfa oluşturucu eklemeye izin verilmez.
✔️ İzİn VERİlDİ: bir değerinden
ref readonly
ref
dönüş değerine değiştirme (sanal yöntemler veya arabirimler dışında)✔️ İzİn VERİlDİ: Alanın statik türü değiştirilebilir bir değer türü olmadığı sürece bir alandan salt okunur olarak kaldırılıyor
✔️ İzİn VERİlDİ: Daha önce tanımlanmamış yeni bir olayı çağırma
❓ YARGI GEREKTİRİR: Türe yeni örnek alanı ekleme
Bu değişiklik serileştirmeyi etkiler.
❌İZIN VERilmeyen: Genel üyeyi veya parametreyi yeniden adlandırma veya kaldırma
Bu, yeniden adlandırılan veya kaldırılan üyeyi veya parametreyi kullanan tüm kodu keser.
Bu, bir özellikten bir alıcı veya ayarlayıcıyı kaldırmayı veya yeniden adlandırmayı ve numaralandırma üyelerini yeniden adlandırmayı veya kaldırmayı içerir.
❌İZIN VERilmeyen: Arabirime üye ekleme
Bir uygulama sağlarsanız, var olan bir arabirime yeni bir üye eklemek, aşağı akış derlemelerinde derleme hatalarıyla sonuçlanmayacaktır. Ancak, tüm diller varsayılan arabirim üyelerini (DIM' ler) desteklemez. Ayrıca bazı senaryolarda, çalışma zamanı hangi varsayılan arabirim üyesinin çağrılabileceğine karar veremiyor. Bu nedenlerden dolayı, var olan bir arabirime üye eklemek hataya neden olan bir değişiklik olarak kabul edilir.
❌İZIN VERilmeyen: Ortak sabit veya sabit listesi üyesinin değerini değiştirme
❌İZIN VERilmeyen: Özellik, alan, parametre veya dönüş değerinin türünü değiştirme
❌İZIN VERilmeyen: Parametreleri ekleme, kaldırma veya sırasını değiştirme
❌İZIN VERilmeyen: Bir parametreden in, out veya ref anahtar sözcüğünü ekleme veya kaldırma
❌İZIN VERİlMEDİ: Parametreyi yeniden adlandırma (büyük/küçük harf değiştirme dahil)
Bu, iki nedenden dolayı hata olarak kabul edilir:
Visual Basic'teki geç bağlama özelliği ve C# dilinde dinamik gibi geç bağlı senaryoları keser.
Geliştiriciler adlandırılmış bağımsız değişkenler kullandığında kaynak uyumluluğunu bozar.
❌İZIN VERilmeyen: Dönüş değerinden
ref
dönüş değerine değiştirmeref readonly
❌️ İzin Verilmeyen: Sanal bir yöntem veya arabirimde bir değerden
ref readonly
ref
dönüş değerine değiştirme❌İZIN VERİlMEDİ: Üyeden soyut ekleme veya kaldırma
❌İZIN VERilmeyen: Üyeden sanal anahtar sözcüğü kaldırma
❌İZIN VERilmeyen: Üyeye sanal anahtar sözcük ekleme
C# derleyicisi sanal olmayan yöntemleri çağırmak için çağıran Ara Dil (IL) yönergeleri yayma eğiliminde olduğundan bu genellikle hataya neden olan bir değişiklik olmasa da (
callvirt
normal bir çağrı olmasa da null bir denetim gerçekleştirir), bu davranış çeşitli nedenlerden dolayı değişmez değildir:C#, .NET'in hedeflediği tek dil değildir.
C# derleyicisi, hedef yöntem sanal olmayan ve büyük olasılıkla null (?. null yayma işleci aracılığıyla erişilen bir yöntem gibi) her zaman normal bir çağrıya iyileştirmeye
callvirt
çalışır.
Yöntemi sanal hale getirmek, tüketici kodunun genellikle sanal olmayan bir şekilde çağıracağı anlamına gelir.
❌İZIN VERİlMEDİ: Sanal üyeyi soyutlama
Sanal üye, türetilmiş bir sınıf tarafından geçersiz kılınabilen bir yöntem uygulaması sağlar. Soyut üye hiçbir uygulama sağlamaz ve geçersiz kılınması gerekir.
❌İZIN VERilmeyen: Korumalı anahtar sözcüğü bir arabirim üyesine ekleme
Varsayılan arabirim üyesine eklemek
sealed
, bunu sanal olmayan hale getirir ve türetilmiş bir türün bu üyenin uygulamasının çağrılmasını engeller.❌İZIN VERİlMEDİ: Erişilebilir (genel veya korumalı) oluşturucuları olan ve korumalı olmayan bir ortak türe soyut üye ekleme
❌İZIN VERilmeyen: Bir üyeden statik anahtar sözcüğü ekleme veya kaldırma
❌İZIN VERilmeyen: Mevcut aşırı yüklemeyi engelleyen ve farklı bir davranış tanımlayan bir aşırı yükleme ekleme
Bu, önceki aşırı yüklemeye bağlı olan mevcut istemcileri bozar. Örneğin, bir sınıf kabul eden UInt32bir yöntemin tek bir sürümüne sahipse, mevcut bir tüketici bir değer geçirirken Int32 bu aşırı yüklemeye başarıyla bağlanır. Ancak, yeniden derlerken veya geç bağlama kullanırken bir kabul eden bir Int32aşırı yükleme eklerseniz, derleyici artık yeni aşırı yüklemeye bağlanır. Farklı davranış sonuçları verirse, bu hataya neden olan bir değişikliktir.
❌İZIN VERilmeyen: Daha önce parametresiz oluşturucu eklemeden oluşturucu içermeyen bir sınıfa oluşturucu ekleme
❌️ İZIN VERilmeyen: Alana salt okunur ekleme
❌İZIN VERilmeyen: Bir üyenin görünürlüğünü azaltma
Bu, erişilebilir ( veya ) oluşturucular olduğunda ve tür korumalı olmadığında korumalı bir üyenin görünürlüğünü azaltmayı içerir.
protected
public
Böyle bir durum söz konusu değilse, korumalı üyenin görünürlüğünü azaltmaya izin verilir.Üyenin görünürlüğünü artırmaya izin verilir.
❌İZIN VERilmeyen: Üyenin türünü değiştirme
Bir yöntemin dönüş değeri veya özellik veya alan türü değiştirilemez. Örneğin, döndüren Object bir yöntemin imzası, döndürecek Stringşekilde değiştirilemez veya tersi de geçerlidir.
❌İZIN VERilmeyen: Abonelik dışı alanları olmayan bir yapıya örnek alanı ekleme
Bir yapının yalnızca ortak alanları varsa veya hiç alanı yoksa, çağıranlar yapının oluşturucusunu çağırmadan veya ilk kullanımdan önce yapıda tüm genel alanlar ayarlandığı sürece yerel
default(T)
olarak başlatmadan bu yapı türünün yerellerini bildirebilir. Bu tür bir yapıya genel veya nonpublic gibi yeni alanlar eklemek, derleyici artık ek alanların başlatılmasını gerektireceği için bu arayanlar için kaynak hataya neden olan bir değişikliktir.Ayrıca, alanları olmayan veya yalnızca ortak alanları olan bir yapıya yeni alanlar (genel veya abonelik dışı) eklemek, kodlarına uygulanmış
[SkipLocalsInit]
arayanlar için ikili hataya neden olan bir değişikliktir. Derleyici derleme zamanında bu alanların farkında olmadığından, yapıyı tam olarak başlatmayan IL yayarak başlatılmamış yığın verilerinden yapının oluşturulmasına yol açabilir.Yapıda herhangi bir nonpublic alanı varsa, derleyici zaten oluşturucu veya
default(T)
aracılığıyla başlatmayı zorlar ve yeni örnek alanları eklemek hataya neden olan bir değişiklik değildir.❌İZIN VERilmeyen: Daha önce hiç tetiklenmediğinde mevcut bir olayı tetikleme
Davranış değişiklikleri
Bütünleştirilmiş Kodlar
✔️ İzİn VERİlDİ: Aynı platformlar hala desteklendiğinde bir derlemenin taşınabilir hale getirilmesi
❌İZIN VERilmeyen: Derlemenin adını değiştirme
❌İZIN VERilmeyen: Derlemenin ortak anahtarını değiştirme
Özellikler, alanlar, parametreler ve dönüş değerleri
✔️ İZİn VERİlDİ: Bir özelliğin, alanın, dönüş değerinin veya out parametresinin değerini daha türetilmiş bir türe değiştirme
Örneğin, türü Object döndüren bir yöntem bir örnek döndürebilir String . (Ancak, yöntem imzası değiştirilemez.)
✔️ İzİn VERİlDİ: Üye sanal değilse bir özellik veya parametre için kabul edilen değer aralığını artırma
Yöntemine geçirilebilen veya üye tarafından döndürülen değer aralığı genişletilebilir ancak parametre veya üye türü genişletilemez. Örneğin, bir yönteme geçirilen değerler 0-124'ten 0-255'e genişletilebilirken, parametre türü olarak Byte Int32değiştirilemez.
❌İZIN VERilmeyen: Üye sanalsa bir özellik veya parametre için kabul edilen değer aralığını artırma
Bu değişiklik, genişletilmiş değer aralığı için düzgün çalışmayan mevcut geçersiz kılınan üyeleri keser.
❌İZIN VERİlMEDİ: Bir özellik veya parametre için kabul edilen değer aralığını azaltma
❌İZIN VERilmeyen: Bir özellik, alan, dönüş değeri veya out parametresi için döndürülen değer aralığını artırma
❌DISALLOWED: Bir özellik, alan, yöntem dönüş değeri veya out parametresi için döndürülen değerleri değiştirme
❌İZIN VERilmeyen: Özellik, alan veya parametrenin varsayılan değerini değiştirme
Parametre varsayılan değerini değiştirmek veya kaldırmak ikili bir kesme değildir. Parametre varsayılan değerinin kaldırılması bir kaynak sonudur ve parametre varsayılan değerinin değiştirilmesi, yeniden derlemeden sonra davranışsal bir kesmeye neden olabilir.
Bu nedenle, belirsizliği ortadan kaldırmak için bu varsayılan değerleri yeni bir yöntem aşırı yüklemesine "taşıma" durumunda parametre varsayılan değerlerinin kaldırılması kabul edilebilir. Örneğin, mevcut bir yöntemi
MyMethod(int a = 1)
düşünün. ve iki isteğe bağlı parametresiyleb
a
bir aşırı yüklemeMyMethod
eklerseniz, varsayılan değerinia
yeni aşırı yüklemeye taşıyarak uyumluluğu koruyabilirsiniz. Şimdi iki aşırı yükleme veMyMethod(int a = 1, int b = 2)
şeklindedirMyMethod(int a)
. Bu desen derlemeye olanak tanırMyMethod()
.❌İZIN VERilmeyen: Sayısal dönüş değerinin duyarlığı değiştirme
❓ HÜKÜM GEREKTİrİr: Giriş ayrıştırma ve yeni özel durumlar oluşturma (ayrıştırma davranışı belgelerde belirtilmemiş olsa bile) değişiklik
Özel durumlar
✔️ İzİn VERİlDİ: Mevcut bir özel durumdan daha türetilmiş bir özel durum oluşturma
Yeni özel durum mevcut bir özel durumun alt sınıfı olduğundan, önceki özel durum işleme kodu özel durumu işlemeye devam eder. Örneğin, .NET Framework 4'te kültür oluşturma ve alma yöntemleri, kültür bulunamazsa yerine bir ArgumentException oluşturmaya CultureNotFoundException başladı. ' CultureNotFoundException den ArgumentExceptiontüretildiği için bu kabul edilebilir bir değişikliktir.
✔️ İzİn VERİlDİ: , değerinden NotImplementedExceptionNotSupportedExceptiondaha özel bir özel durum oluşturmaNullReferenceException
✔️ İzİn VERİlDİ: Kurtarılamaz olarak kabul edilen bir özel durum oluşturma
Kurtarılamayan özel durumlar yakalanmamalı, bunun yerine üst düzey tümünü yakala işleyicisi tarafından işlenmelidir. Bu nedenle, kullanıcıların bu açık özel durumları yakalayan koda sahip olması beklenmez. Kurtarılamaz özel durumlar şunlardır:
✔️ İzİn VERİlDİ: Yeni bir kod yolunda yeni bir özel durum oluşturma
Özel durum yalnızca yeni parametre değerleri veya durumuyla yürütülen ve önceki sürümü hedefleyen mevcut kod tarafından yürütülemez yeni bir kod yolu için geçerli olmalıdır.
✔️ İzİn VERİlDİ: Daha sağlam davranış veya yeni senaryolar sağlamak için özel durumu kaldırma
Örneğin, daha önce yalnızca pozitif değerleri işleyen ve başka bir değer oluşturan bir
Divide
ArgumentOutOfRangeException yöntem, özel durum oluşturmadan hem negatif hem de pozitif değerleri destekleyecek şekilde değiştirilebilir.✔️ İzİn VERİlDİ: Hata iletisinin metnini değiştirme
Geliştiriciler hata iletilerinin metnine güvenmemelidir ve bu, kullanıcının kültürüne göre de değişir.
❌İZIN VERİlMEDİ: Yukarıda listelenmeyen başka bir durumda özel durum oluşturma
❌İZIN VERİlMEDİ: Yukarıda listelenmeyen başka bir durumda özel durumu kaldırma
Özellikler
✔️ İzİn VERİlDİ: Gözlemlenemeyen bir özniteliğin değerini değiştirme
❌İZIN VERİlMEDİ: Gözlemlenebilir bir özniteliğin değerini değiştirme
❓ HÜKÜM GEREKTİRİYOR: Özniteliği kaldırma
Çoğu durumda, bir özniteliğin (örneğin NonSerializedAttribute) kaldırılması hataya neden olan bir değişikliktir.
Platform desteği
✔️ İzİn VERİlDİ: Daha önce desteklenmeyen bir platformda bir işlemi destekleme
❌İZIN VERİlMEDİ: Platformda daha önce desteklenen bir işlem için belirli bir hizmet paketini desteklemiyor veya şimdi gerekli değil
İç uygulama değişiklikleri
❓ YARGI GEREKTİRİR: İç türün yüzey alanını değiştirme
Bu tür değişikliklere genellikle izin verilir, ancak bunlar özel yansımayı bozar. Popüler üçüncü taraf kitaplıklarının veya çok sayıda geliştiricinin iç API'lere bağımlı olduğu bazı durumlarda, bu tür değişikliklere izin verilmeyebilir.
❓ YARGI GEREKTİRİSİ: Bir üyenin iç uygulamasını değiştirme
Bu değişikliklere genellikle izin verilir, ancak özel yansımayı bozarlar. Müşteri kodunun sık sık özel yansımaya bağımlı olduğu veya değişikliğin istenmeyen yan etkilere neden olduğu bazı durumlarda, bu değişikliklere izin verilmeyebilir.
✔️ İzİn VERİlDİ: bir işlemin performansını geliştirme
Bir işlemin performansını değiştirme özelliği önemlidir, ancak bu tür değişiklikler bir işlemin geçerli hızına bağlı olan kodu bozabilir. Bu, özellikle zaman uyumsuz işlemlerin zamanlamasına bağlı olan kodlar için geçerlidir. Performans değişikliğinin söz konusu API'nin diğer davranışları üzerinde hiçbir etkisi olmamalıdır; aksi takdirde, değişiklik bozulacaktır.
✔️ İzİn VERİlDİ: Bir işlemin performansını dolaylı olarak (ve genellikle olumsuz şekilde) değiştirme
Söz konusu değişiklik başka bir nedenle hata olarak kategorize edilmezse, bu kabul edilebilir bir durumdur. Genellikle, ek işlemler içerebilecek veya yeni işlevler ekleyebilen eylemlerin yapılması gerekir. Bu neredeyse her zaman performansı etkiler, ancak söz konusu API'nin beklendiği gibi çalışması için gerekli olabilir.
❌İZIN VERilmeyen: Zaman uyumlu API'yi zaman uyumsuz olarak değiştirme (ve tam tersi)
Kod değişiklikleri
✔️ İzİn VERİlDİ: Parametreye parametreler ekleme
❌İZIN VERilmeyen: Bir yapıyı bir sınıfa veya tam tersi olarak değiştirme
❌İZIN VERilmeyen: İşaretli anahtar sözcüğü bir kod bloğuna ekleme
Bu değişiklik, daha önce yürütülen kodun ve OverflowException oluşturmasına neden olabilir ve kabul edilemez.
❌DISALLOWED: Parametreden parametreleri kaldırma
❌İZIN VERilmeyen: Olayların tetiklenme sırasını değiştirme
Geliştiriciler makul bir şekilde olayların aynı sırada tetiklenmesi beklenebilir ve geliştirici kodu genellikle olayların tetiklenme sırasına bağlıdır.
❌İZIN VERilmeyen: Belirli bir eylemde bir olayın oluşturulmasını kaldırma
❌İZIN VERilmeyen: Verilen olayların çağrılma sayısını değiştirme
❌İZIN VERilmeyen: numaralandırma türüne ekleme FlagsAttribute