Réponse courte : Les définitions de type de valeur ne nécessitent que extends [mscorlib]System.ValueType
; le value
semble être facultatif et n'a aucun effet apparent.
Je suppose que la spécification du CLI ( ECMA-335 ) serait le meilleur endroit pour trouver une réponse faisant autorité.
La définition d'un type de valeur DOIT inclure l'élément value
attribut ?
La section II.10 traite de la définition des types. Plus précisément, la sous-section II.10.1.3 stipule :
Les attributs sémantiques de type précisent si une interface, une classe ou un type de valeur doit être défini. Si [l'attribut interface
] n'est pas présent et la définition étend (directement ou indirectement) System.ValueType
et la définition n'est pas pour System.Enum
un type de valeur doit être défini (§II.13). Sinon, une classe doit être définie (§II.11).
En value
Cet attribut n'est pas du tout mentionné dans toute la section.
Conclusion : Une définition correcte de type de valeur ne doit pas nécessairement inclure value
. Dérivant de System.ValueType
est suffisante.
PEUT-ÊTRE qu'une définition de type de valeur inclut l'élément value
modificateur ?
La norme CLI contient également une grammaire pour ILASM (dans la section VI.C.3). Selon cette grammaire, il existe un value
attribut pour .class
les définitions de type. J'ai également cherché dans la norme des définitions concrètes de types de valeurs et j'ai trouvé ces exemples :
.class public sequential ansi serializable sealed beforefieldinit System.Double extends System.ValueType …
.class private sealed Rational extends [mscorlib]System.ValueType …
-
.class
value
sealed public MyClass extends [mscorlib]System.ValueType …
Conclusion : A value
peut être inclus dans une définition de type de valeur.
Et que fait le value
attribut MEAN ?
J'ai essayé de compiler ces trois définitions de type IL dans un assemblage :
.class public sealed … A extends [mscorlib]System.ValueType { … }
.class value public sealed … B extends [mscorlib]System.ValueType { … }
.class value public sealed … C extends [mscorlib]System.Object { … } // !!!
Il n'y a pas eu d'erreur de compilation, même si le value
est utilisé dans une déclaration de type de référence (voir la dernière ligne). L'examen de l'assemblage résultant à l'aide du navigateur d'objets de Visual Studio 2012 révèle deux types de valeurs ( struct
) A
y B
et un type de référence ( class
) C
.
Spéculation : La présence de la value
n'a aucun effet sur la définition du type. Il n'est là que pour aider les humains à repérer les définitions de type de valeur.