Contrairement à une autre réponse, il existe des types autres que T=System.Object pour lesquels cela compile :
class Samplewhere T:class where U:struct, T
La contrainte "T : classe" ne signifie pas réellement que T doit être une classe. Elle signifie que T doit être un type de référence. Cela inclut les interfaces, et les structs peuvent implémenter des interfaces. Ainsi, par exemple, T=IConvertible, U=System.Int32 fonctionne parfaitement bien.
Je ne peux pas imaginer que ce soit une contrainte particulièrement courante ou utile, mais ce n'est pas tout à fait aussi contre-intuitif que cela puisse paraître à première vue.
Quant au point plus général : comme le dit Obiwan Kenobi, tout dépend de votre point de vue. La spécification CLI a une explication assez compliquée à ce sujet, où "dérive de" et "hérite de" ne signifient pas tout à fait la même chose, IIRC. Mais non, vous ne pouvez pas spécifier le type de base d'un type de valeur - c'est toujours soit System.ValueType
ou System.Enum
(qui dérive de System.ValueType
) et qui est choisi en fonction du fait que vous déclarez ou non un fichier struct
ou un enum
. Il est quelque peu déroutant que ces deux éléments soient eux-mêmes des types de référence...