Pour clarifier la réponse correcte de Danny Chen :
-
Nullable<T>
est un type de valeur. Le type de valeur se compose d'un bool, qui indique la nullité (false signifie null) et d'un T, la valeur.
- Contrairement à tous les autres types de valeurs, les types nullables ne sont pas encadrés par une boîte.
Nullable<T>
. Il s'agit soit d'une boîte T
ou une référence nulle.
- Une méthode mise en œuvre par un type de valeur
S
est implémenté comme s'il avait un ref S
argument ; c'est ainsi que this
est adoptée.
- Une méthode mise en œuvre par un type de référence
C
est mis en œuvre comme s'il existait un C
argument ; c'est ainsi que this
est adoptée.
- Le cas intéressant est alors une méthode virtuelle définie dans une classe de base de référence et surchargée par une structure qui hérite de la classe de base.
Vous avez maintenant suffisamment d'informations pour déduire ce qui se passe. GetHashCode
est virtuel et remplacée par Nullable<T>
donc quand vous l'appelez, vous l'appelez comme s'il y avait une invisible ref Nullable<T>
argument pour this
. Il n'y a pas de boxe.
GetType
n'est pas virtuelle et ne peut donc pas être surchargée, elle est définie sur object
. Il s'attend donc à un object
pour this
Lorsqu'il est appelé sur un Nullable<T>
le receveur doit être boxé, et donc peut boxer vers le nul, et donc peut lancer.
Si vous avez appelé ((object)x).GetHashCode()
alors vous verriez une exception.
0 votes
La seule différence que je peux trouver, c'est que
GetHashCode
estvirtual
...1 votes
ILSpy est un petit outil pratique qui permet de répondre à ce genre de questions.
3 votes
Je trouve étrange que
GetType()
d'unNullable<int>
renvoie àSystem.Int32
et nonSystem.Nullable<System.Int32>
.1 votes
A noter également
int? x = null
est un sucre syntaxique pourNullable<int> x = new Nullable<int>(null)
. Donc,x
est un objet réel, et non une référence nulle.0 votes
Source de référence - github.com/Microsoft/referencesource/blob/master/mscorlib/ - ne montre en aucun cas que GetType est géré, et la documentation ne le détaille pas non plus - docs.microsoft.com/fr/us/dotnet/api/