Çerçevede, kendilerinden türetilen tüm türlere etkin bir şekilde özel nitelikler aktaran ancak bu özelliklere sahip olmayan belirli sınıflar vardır . CLR'nin kendisi, bu sınıfların kısıtlama olarak kullanılmasına karşı herhangi bir yasak getirmez, ancak bunlarla sınırlı olan genel türler, somut türlerin yapacağı gibi miras alınmayan özellikleri edinmez. C # yaratıcıları, bu tür davranışların bazı insanların kafasını karıştırabileceğinden ve bunun için herhangi bir fayda göremedikleri için, CLR'de yaptıkları gibi davranmalarına izin vermek yerine bu tür kısıtlamaları yasaklamaları gerektiğine karar verdiler.
Örneğin, birinin yazmasına izin verildiyse void CopyArray<T>(T dest, T source, int start, int count)
:; Bir geçmek mümkün olur dest
ve source
tip bir bağımsız değişken beklemek yöntemlere System.Array
; bundan başka, bir derleme doğrulama bu alacağı dest
ve source
uyumlu bir dizi tipleri, ama biri kullanılarak dizi erişim elemanlarına mümkün olmaz []
operatör.
Kullanım yetersizlik Array
bir kısıtlama olarak, çünkü çoğunlukla oldukça kolay bir çözüm sağlamaktır void CopyArray<T>(T[] dest, T[] source, int start, int count)
eski yöntem çalışacak neredeyse tüm durumda irade çalışması. Bununla birlikte, bir zayıflığı vardır: önceki yöntem System.Array
, bağımsız değişkenlerin uyumsuz dizi türleri olduğu durumları reddederken , bağımsız değişkenlerden birinin veya her ikisinin de türde olduğu senaryoda çalışır ; Her iki argümanın da türde olduğu bir aşırı yük eklemek System.Array
, kodun kabul etmesi gereken ek durumları kabul etmesine neden olur, ancak aynı zamanda olmaması gereken durumları da yanlışlıkla kabul etmesine neden olur.
Özel kısıtlamaların çoğunu yasadışı ilan etme kararını rahatsız edici buluyorum. Sıfır anlamsal anlama sahip olan tek şey, System.Object
[çünkü bu bir kısıtlama olarak yasal olsaydı, herhangi bir şey onu tatmin ederdi]. System.ValueType
Muhtemelen pek kullanışlı olmayacaktır, çünkü türden referanslar ValueType
değer türleriyle pek ortak noktaya sahip değildir, ancak Düşünme ile ilgili durumlarda makul bir şekilde bir değeri olabilir. Hem System.Enum
ve System.Delegate
bazı gerçek kullanımlara olurdu, ancak C # yaratıcıları onları düşünmüyordu beri onlar sebepsiz yasadışı ediyoruz.