มีชั้นเรียนบางอย่างในกรอบที่มีประสิทธิภาพผ่านในลักษณะพิเศษเพื่อทุกประเภทที่ได้มาจากพวกเขาแต่ไม่ได้มีลักษณะเหล่านั้นตัวเอง CLR เองไม่ได้กำหนดข้อห้ามในการใช้คลาสเหล่านั้นเป็นข้อ จำกัด แต่ประเภททั่วไปที่ จำกัด ไว้สำหรับพวกเขาจะไม่ได้รับลักษณะที่ไม่ได้รับการสืบทอดมาอย่างที่ประเภทคอนกรีตจะทำได้ ผู้สร้าง C # ตัดสินใจว่าเนื่องจากพฤติกรรมดังกล่าวอาจทำให้บางคนสับสนและพวกเขาไม่เห็นประโยชน์ใด ๆ กับมันพวกเขาจึงควรห้ามข้อ จำกัด ดังกล่าวแทนที่จะอนุญาตให้พวกเขาประพฤติตามที่พวกเขาทำใน CLR
ตัวอย่างเช่นหากมีคนหนึ่งได้รับอนุญาตให้เขียน: void CopyArray<T>(T dest, T source, int start, int count)
; หนึ่งจะสามารถส่งผ่านdest
และsource
วิธีการที่คาดว่าจะมีอาร์กิวเมนต์ประเภทSystem.Array
; อีกคนหนึ่งจะได้รับการตรวจสอบรวบรวมเวลานั้นdest
และsource
เป็นชนิดอาร์เรย์ที่เข้ากันได้ แต่จะไม่สามารถที่จะเข้าถึงองค์ประกอบของอาร์เรย์ที่ใช้[]
ประกอบการ
การไม่สามารถใช้Array
เป็นข้อ จำกัด นั้นค่อนข้างง่ายในการแก้ไขเนื่องจากvoid CopyArray<T>(T[] dest, T[] source, int start, int count)
จะใช้ได้ในเกือบทุกสถานการณ์ที่วิธีการเดิมจะใช้ได้ผล อย่างไรก็ตามมันมีจุดอ่อน: วิธีการเดิมจะใช้ได้ในสถานการณ์ที่อาร์กิวเมนต์หนึ่งหรือทั้งสองเป็นประเภทSystem.Array
ในขณะที่ปฏิเสธกรณีที่อาร์กิวเมนต์เป็นประเภทอาร์เรย์ที่เข้ากันไม่ได้ การเพิ่มการโอเวอร์โหลดโดยที่อาร์กิวเมนต์ทั้งสองเป็นประเภทSystem.Array
จะทำให้โค้ดยอมรับกรณีเพิ่มเติมที่ควรยอมรับ แต่ยังทำให้ยอมรับกรณีที่ไม่ควรผิดพลาดด้วย
ฉันพบว่าการตัดสินใจที่จะทำผิดกฎหมายข้อ จำกัด พิเศษส่วนใหญ่นั้นน่ารำคาญ สิ่งเดียวที่จะไม่มีความหมายทางความหมายก็คือSystem.Object
[เนื่องจากหากเป็นข้อ จำกัด ทางกฎหมายสิ่งใดก็จะตอบสนองได้] System.ValueType
อาจไม่มีประโยชน์มากนักเนื่องจากการอ้างอิงประเภทValueType
ไม่ได้มีความเหมือนกันกับประเภทค่ามากนัก แต่อาจมีค่าบางอย่างในกรณีที่เกี่ยวข้องกับการสะท้อนกลับ ทั้งสองอย่างSystem.Enum
และSystem.Delegate
จะมีการใช้งานจริง แต่เนื่องจากผู้สร้าง C # ไม่ได้คิดถึงสิ่งเหล่านี้พวกเขาจึงผิดกฎหมายโดยไม่มีเหตุผลที่ดี