Вопреки другому ответу, есть другие типы, кроме T = System.Object, где это компилируется:
class Samplewhere T:class where U:struct, T
Ограничение "T: class" на самом деле не означает, что T должен быть классом. Это означает, что T должен быть ссылочным типом. Это включает интерфейсы, и структуры могут реализовать интерфейсы. Так, например, T = IConvertible, U = System.Int32 работает отлично.
Я не могу себе представить, что это особенно распространенное или полезное ограничение, но оно не вполне настолько противоречиво, как кажется на первый взгляд.
Что касается более общего положения: как говорит Обиван Кеноби, все зависит от вашей точки зрения. Спецификация CLI имеет довольно сложное объяснение этого, где «происхождение от» и «наследование от» не означают совсем одно и то же, IIRC. Но нет, вы не можете указать базовый тип типа значения - это всегда либо System.ValueType
, либо System.Enum
(что происходит от System.ValueType
), и это выбирается на основе того, объявляете ли вы struct
или enum
. Несколько странно, что оба они являются ссылочными типами ...