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 destdan sourceke metode yang mengharapkan sebuah argumen bertipe System.Array; selanjutnya, seseorang akan mendapatkan validasi waktu kompilasi itu destdan sourcemerupakan tipe array yang kompatibel, tetapi seseorang tidak akan bisa mengakses elemen dari array menggunakan []operator.
Ketidakmampuan untuk menggunakan Arraysebagai 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.Arraysementara menolak kasus di mana argumen merupakan jenis array yang tidak kompatibel; menambahkan overload di mana kedua argumen memiliki tipe System.Arrayakan 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.ValueTypemungkin tidak akan terlalu berguna, karena referensi tipe ValueTypetidak memiliki banyak kesamaan dengan tipe nilai, tetapi mungkin masuk akal memiliki beberapa nilai dalam kasus yang melibatkan Refleksi. Keduanya System.Enumdan System.Delegateakan memiliki kegunaan nyata, tetapi karena pencipta C # tidak memikirkannya, mereka dilarang tanpa alasan yang jelas.