4 votes

Comment un struct peut-il hériter d'une classe dans les contraintes de paramètres de type ?

J'ai vu la ligne de code suivante :

class Sample<T,U> where T:class where U: struct, T

Dans le cas ci-dessus, le paramètre U es type de valeur et il dérive de type de référence T .

Comment cette ligne peut-elle être légale ?
En outre, si un type de valeur hérite d'un type de référence, où la mémoire est-elle allouée : au tas ou à la pile ?

6voto

Jon Skeet Points 692016

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...

2voto

Gishu Points 59012

Tous les structs dérivent implicitement du type ValueType. Vous ne pouvez pas spécifier un type de base explicite.
Se référer à ce tutoriel MSDN sur les structs tel que posté par codemelt .

  • Lorsque vous instanciez une structure, par exemple en tant que variable locale, elle est allouée sur la pile (meilleures performances).
  • Les classes peuvent contenir des structs comme membres - dans ce cas, ils sont alloués sur le tas.

1voto

codemeit Points 9327

MSDN dit,

Il n'y a pas d'héritage pour les structs comme comme pour les classes. Une structure ne peut pas hériter d'une autre structure ou classe, et elle ne peut pas être la base d'une classe. Les structures, cependant, héritent de la objet de la classe de base. Un struct peut implémenter des interfaces, et il le fait exactement comme les classes.

1voto

Randolpho Points 36512

Sasha a écrit :

S'il n'y a pas d'héritage autorisé, alors pourquoi ce qui suit est légal :

classe Samplewhere T:classe où U:struct, T

Dans le cas ci-dessus, le paramètre U est type de valeur, et il dérive de T -- type de référence

Bien que cela soit légal du point de vue du contrat générique, vous n'obtiendrez jamais de code utile utilisant cette classe pour compiler, parce que vous n'aurez jamais un type autre que T=System.Object qui remplit la contrainte U. Vous pouvez considérer qu'il s'agit d'un bogue très mineur dans l'implémentation des génériques en C#.

0voto

JaredPar Points 333733

Les structures ne peuvent hériter de rien d'autre que System.ValueType ou System.Enum. Il est impossible qu'une structure puisse hériter d'un type de référence normal. Il est donc malheureusement impossible de répondre à cette question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X