Вопреки другому ответу, существуют типы помимо 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
. Несколько сбивает с толку тот факт, что оба они сами по себе являются ссылочными типами...
person
Jon Skeet
schedule
24.02.2009