Pourriez-vous s'il vous plaît expliquer, pourquoi Console.WriteLine écrit-il une ligne vide ( Console.WriteLine(null)
me donne une erreur de compilation) et pourquoi il n'y a pas NullReferenceException (même a+=1
ne devrait pas le lever)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
++
,+=
et+
ont soulevé des variantes. Par conséquent, les déclarationsa++;
,a += 1;
eta = a + 1;
sont toutes autorisées. Chaque produitnull
(aucune exception lancée)a
est initialementnull
.NullReferenceException
? mais ceint?
n'est pas unReference
, c'est juste unint
qui peut prendre de lanull
valeurRéponses:
Vous observez les effets d'un opérateur soulevé .
De la section 7.3.7 de la spécification C # 5:
Donc, fondamentalement,
a++
dans ce cas est une expression avec un résultat denull
(en tant queint?
) et la variable est laissée intacte.Quand vous appelez
qui est encadré dans
object
, qui le convertit en une référence nulle, qui est imprimée sous forme de ligne vide.la source
Console.WriteLine(a == null ? "null" : a)
?a
est de typeint?
, je dirais qu'ila ?? "null"
ne trouve aucun type commun pour les deux opérandes. Vous avez besoin d'un indice quiobject
est le type courant. Alors lancez l'un ou l'autre des opérandes en cela. Lea
sera en boîte. Par exemple((object)a) ?? "null"
oua ?? (object)"null"
.La réponse de Jon est correcte mais j'ajouterais quelques notes supplémentaires.
Il y a 19 surcharges de
Console.WriteLine
et trois d'entre elles sont applicables à anull
: celle qui prend astring
, celle qui prend achar[]
et celle qui prend unobject
. C # ne peut pas déterminer lequel de ces trois vous voulez dire, il donne donc une erreur.Console.WriteLine((object)null)
serait légal parce que maintenant c'est clair.a
est un nulint?
. La résolution de surcharge choisit laobject
version de la méthode, de sorte que leint?
est encadré à une référence nulle. C'est donc fondamentalement le même queConsole.WriteLine((object)null)
, qui écrit une ligne vide.Où est la référence nulle qui vous inquiète?
a
est un nullint?
qui n'est pas un type de référence pour commencer! N'oubliez pas que les types valeur Nullable sont des types valeur , pas des types référence , donc ne vous attendez pas à ce qu'ils aient une sémantique de référence à moins qu'ils ne soient encadrés par un type référence. Il n'y a pas de boxe dans l'addition.la source
Cette déclaration signifie simplement
null++
nul + 1.Selon ce document, un type Nullable peut représenter la plage correcte de valeurs pour son type de valeur sous-jacent, plus une valeur nulle supplémentaire. peut recevoir la valeur nulle
Ici, vous incrémentez null, puis il deviendra également une valeur nulle et non 0 ou tout autre entier.
lorsque vous imprimez un type Nullable avec une valeur Null, il imprime un blanc au lieu d'une erreur car vous imprimez une variable, c'est-à-dire la valeur d'un emplacement mémoire. qui peut-être nul ou n'importe quel entier.
Mais lorsque vous essayez d'imprimer null en utilisant
Console.WriteLine(null)
, comme null n'est pas une variable, il ne fait donc référence à aucun emplacement mémoire. Et par conséquent, cela donne une erreur"NullReferenceException"
.Dans ce cas, 2 sera mis en mémoire à un emplacement temporaire et le pointeur pointe vers cet emplacement de mémoire à imprimer.
la source