¿Podría explicar por qué Console.WriteLine escribe una línea vacía ( Console.WriteLine(null)
dame un error de compilación) y por qué no hay NullReferenceException (ni siquiera a+=1
debería generarla)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
++
,+=
y+
han levantado variantes. Por lo tanto, las declaracionesa++;
,a += 1;
ya = a + 1;
están todas permitidas. Cada productonull
(sin excepción) sia
es inicialmentenull
.NullReferenceException
? peroint?
no es unReference
, es solo unint
que puede tenernull
valorRespuestas:
Estás observando los efectos de un operador elevado .
De la sección 7.3.7 de la especificación C # 5:
Básicamente,
a++
en este caso es una expresión con un resultado denull
(comoint?
) y la variable se deja intacta.Cuando usted llama
que está encuadrado
object
, lo que lo convierte en una referencia nula, que se imprime como una línea vacía.fuente
Console.WriteLine(a == null ? "null" : a)
?a
es de tipoint?
, yo diría quea ?? "null"
no encuentra un tipo común para los dos operandos. Necesita una pista queobject
sea del tipo común. Así que lanza cualquiera de los operandos a eso. Ela
estará en caja. Por ejemplo((object)a) ?? "null"
oa ?? (object)"null"
.La respuesta de Jon es correcta, pero agregaría algunas notas adicionales.
Hay 19 sobrecargas de
Console.WriteLine
y tres de ellas son aplicables a anull
: la que lleva unastring
, la que lleva unachar[]
y la que lleva unaobject
. C # no puede determinar a cuál de estos tres te refieres, por lo que da un error.Console.WriteLine((object)null)
Sería legal porque ahora está claro.a
es un nuloint?
. La resolución de sobrecarga elige laobject
versión del método, por lo queint?
se encuadra en una referencia nula. Entonces esto es básicamente lo mismo queConsole.WriteLine((object)null)
, que escribe una línea vacía.¿Dónde está la referencia nula que te preocupa?
a
es un valor nuloint?
que no es un tipo de referencia para empezar. Recuerde, los tipos de valor que aceptan valores NULL son tipos de valor , no tipos de referencia , por lo que no espere que tengan semántica de referencia a menos que estén encuadrados en un tipo de referencia. No hay boxeo en la adición.fuente
Esta declaración simplemente significa,
null++
es decir, nulo + 1.Según este documento, un tipo que acepta valores NULL puede representar el rango correcto de valores para su tipo de valor subyacente, más un valor nulo adicional. A un valor Nullable, pronunciado "Nullable of Int32", se le puede asignar cualquier valor de -2147483648 a 2147483647, o se le puede asignar el valor nulo
Aquí está incrementando el valor nulo, luego también se convertirá en un valor nulo, no 0 o cualquier otro número entero.
cuando imprime un tipo que acepta valores NULL con valor nulo, se imprime en blanco en lugar de error porque está imprimiendo una variable, es decir, el valor de una ubicación de memoria. que puede ser nulo o cualquier entero.
Pero cuando intenta imprimir nulo usando
Console.WriteLine(null)
, como nulo no es una variable, no se refiere a ninguna ubicación de memoria. Y por eso da error"NullReferenceException"
.En este caso, 2 se almacenará en la memoria en una ubicación temporal y el puntero apunta a esa ubicación de la memoria para imprimir.
fuente