Ada kelas-kelas tertentu dalam Framework yang secara efektif meneruskan karakteristik khusus ke semua tipe yang diturunkan darinya tetapi tidak memiliki karakteristik itu sendiri . CLR sendiri tidak memberlakukan larangan untuk menggunakan kelas-kelas tersebut sebagai batasan, tetapi tipe generik yang dibatasi padanya tidak akan memperoleh karakteristik yang tidak diturunkan seperti tipe konkret. Pencipta C # memutuskan bahwa karena perilaku seperti itu mungkin membingungkan sebagian orang, dan mereka gagal melihat kegunaannya, mereka harus melarang batasan tersebut daripada membiarkan mereka berperilaku seperti yang mereka lakukan di CLR.
Jika, misalnya, seseorang diizinkan untuk menulis void CopyArray<T>(T dest, T source, int start, int count)
:; seseorang akan dapat melewatkan dest
dan source
ke metode yang mengharapkan sebuah argumen bertipe System.Array
; selanjutnya, seseorang akan mendapatkan validasi waktu kompilasi itu dest
dan source
merupakan tipe array yang kompatibel, tetapi seseorang tidak akan bisa mengakses elemen dari array menggunakan []
operator.
Ketidakmampuan untuk menggunakan Array
sebagai kendala sebagian besar cukup mudah untuk dikerjakan, karena void CopyArray<T>(T[] dest, T[] source, int start, int count)
akan bekerja di hampir semua situasi di mana metode sebelumnya akan bekerja. Namun, ia memiliki kelemahan: metode sebelumnya akan bekerja dalam skenario bahwa salah satu atau kedua argumen bertipe System.Array
sementara menolak kasus di mana argumen merupakan jenis array yang tidak kompatibel; menambahkan overload di mana kedua argumen memiliki tipe System.Array
akan membuat kode menerima kasus tambahan yang harus diterimanya, tetapi juga membuatnya salah menerima kasus yang seharusnya tidak diterima.
Menurut saya keputusan untuk melarang sebagian besar batasan khusus menjengkelkan. Satu-satunya yang memiliki makna semantik nol adalah System.Object
[karena jika itu legal sebagai batasan, apa pun akan memuaskannya]. System.ValueType
mungkin tidak akan terlalu berguna, karena referensi tipe ValueType
tidak memiliki banyak kesamaan dengan tipe nilai, tetapi mungkin masuk akal memiliki beberapa nilai dalam kasus yang melibatkan Refleksi. Keduanya System.Enum
dan System.Delegate
akan memiliki kegunaan nyata, tetapi karena pencipta C # tidak memikirkannya, mereka dilarang tanpa alasan yang jelas.