C'est un peu tard, mais en plus de la réponse de Marc à votre question, je veux donner quelques informations supplémentaires sur les types de valeurs nuls dans CLR.
Le CLR a un support intégré pour les types de valeurs nullables. Ce site soutien particulier est prévu pour boxe, unboxing, appel GetType
l'appel des méthodes de l'interface .
Par exemple, vérifions GetType()
:
Int32? x = 5;
Console.WriteLine(x.GetType());
Que pensez-vous qu'il va imprimer dans la console ? System.Nullable<Int32
? Non, le résultat est System.Int32
.
Ou, vérifions la boxe, ce que vous avez noté dans votre question :
Int32? n =5;
Object o = n;
Console.WriteLine("o's type={0}", o.GetType()); // "System.Int32"
La règle est la suivante :
Lorsque le CLR met en boîte une instance Nullable, il vérifie s'il s'agit de est nulle, et si c'est le cas, le CLR ne met rien en boîte, et null est retourné. Si l'instance nullable n'est pas nulle, le CLR prend la valeur valeur de l'instance nullable et la met en boîte. En d'autres termes, un Nullable avec une valeur de 5 est transformé en un boxed-Int32 avec une valeur de 5. valeur de 5.
Et, à la fin, je veux expliquer comment le CLR ajoute un support spécial pour appeler des méthodes d'interface à partir de types nuls. Jetons un coup d'oeil à cela :
Int32? n = 5;
Int32 result = ((IComparable) n).CompareTo(5); // Compiles & runs OK
Console.WriteLine(result); // 0
Dans le code précédent, je lance n, un Nullable<Int32>
à IComparable<Int32>
une interface type. Cependant, le Nullable<T>
ne met pas en œuvre l'option IComparable<Int32>
en tant qu'interface Int32
fait. Le compilateur C# permet à ce code de compiler quand même.
0 votes
int?
boxé commeint
et, en gros, tous les types nuls, Editar : Marc Gravell a la réponse complète0 votes
Related post about nullable type : stackoverflow.com/questions/4028830/ . C'est ce qu'on appelle la "levée de type".
0 votes
Avant de lire ce sujet, je n'aurais même pas pensé que
List<int?>
détient déjà justeint
types. Preuve7 votes
@Sinatr non, c'est incorrect ;
List<int?>
tientint?
. La distinction importante dans cet exemple est l'utilisation de la fonctionList<object>
. Ce que vous voyez dans cette "preuve" est quelque chose de très différent ;GetType()
sur n'importe quelT?
renvoie soit leT
ou lance un NRE. Il jamais renvoie àT?
- meilleur exemple : dotnetfiddle.net/3Gy3Fa - et quant au pourquoi : parce queGetType()
n'est pas virtuel, il ne peut pas être surchargé, et donc appelerGetType()
est une opération de mise en boîte (même si elle est utilisée via un "appel contraint"). Et lorsque vous mettez en boîte unT?
vous obtenez soit unT
comme unobject
ou unnull
.0 votes
@TetsuyaYamamoto Ce n'est pas un lien pertinent. Comment le comportement de boxing/unboxing de Nullable<T> est-il possible ? est.
0 votes
Que pensez-vous qu'il arrive si vous avez un
null
valeur dans votreitems
liste ?0 votes
@MarcGravell Pourquoi est-ce que
OfType<int>().First()
retourner une valeur à partir d'unList<int?>
cependant ? Y a-t-il de la boxe dans cette affaire ?