Bien que le C# prétend que la valeur de type emplacements de stockage tenir les instances des types dérivés de System.ValueType
, qui à son tour dérive System.Object
, qui n'est pas vraiment vrai. Chaque type dérivé de System.ValueType
représente en fait deux types très différents de choses:
- Une collection d'octets qui (pour les types primitifs) représente les données directement, ou (pour les non-primitif types de structure) détient le contenu de tous les champs, publics et privés, mais ne détient aucune information de type.
- Autonome tas d'objet, qui contient un objet-tête en plus de la ci-dessus, dont le type est dérivé de " Système.ValueType`.
Les emplacements de stockage d'un type de valeur de la tenue de la première; tas d'objets d'un type de valeur de la seconde.
Pour diverses raisons, Microsoft a décidé que Nullable<T>
ne devrait soutenir la première utilisation. Si l'on tente de passer un emplacement de stockage de type Nullable<T>
code qui attend une référence à un objet tas, le système va convertir l'élément à un T
si HasValue
est vrai, ou bien tout simplement passer une référence null si HasValue
est faux. Bien qu'il existe de façons de créer un tas d'objet de type Nullable<T>
, les méthodes normales de convertir une valeur de type emplacement de stockage pour un tas d'objet ne sera jamais en produire un.
Notez également que l'appelant GetType()
de la valeur d'emplacement de stockage ne sera pas réellement d'évaluer le type de l'emplacement de stockage, mais au lieu de convertir le contenu de l'emplacement de stockage à un tas d'objets et de retourner ensuite le type de l'objet. Parce que les emplacements de stockage de type Nullable<T>
convertis, soit pour les instances d'objet T
ou null, rien dans l'instance d'un objet permettra de dire si l'emplacement de stockage à partir de laquelle il est venu a été un Nullable<T>
.