c# - float - public nullable int
¿Por qué el incremento de Nullable<int> no produce una excepción? (3)
¿Podría explicar, por qué Console.WriteLine escribe una línea vacía (
Console.WriteLine(null)
me da un error de compilación) y por qué no hay NullReferenceException (incluso
a+=1
no debería aumentarlo)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
¿Estás incrementando nulo ???
int? a = null;
a++;
Esta declaración simplemente significa
null++
es decir, nulo + 1.
Según este documento, un tipo anulable puede representar el rango correcto de valores para su tipo de valor subyacente, más un valor nulo adicional. A un valor anulable, pronunciado "Anulable de Int32", se le puede asignar cualquier valor de -2147483648 a 2147483647, o se le puede asignar el valor nulo
Aquí está incrementando nulo, entonces también se convertirá en un valor nulo, no 0 o cualquier otro número entero.
¿Por qué se imprime en blanco en lugar de error?
cuando imprime un tipo anulable 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 tal vez sea nulo o cualquier número entero.
Pero cuando intenta imprimir nulo con
Console.WriteLine(null)
, ya que nulo no es una variable, por lo que no se refiere a ninguna ubicación de memoria.
Y por lo tanto, da el error
"NullReferenceException"
.
Entonces, ¿cómo puede imprimir cualquier número entero usando
Console.WriteLine(2);
??
En este caso, 2 ingresará en la memoria en una ubicación temporal, y el puntero apunta a esa ubicación de memoria para imprimir.
Estás observando los efectos de un operador elevado .
De la sección 7.3.7 de la especificación C # 5:
Los operadores elevados permiten que los operadores predefinidos y definidos por el usuario que operan con tipos de valores no anulables también se usen con formas anulables de esos tipos. Los operadores elevados se construyen a partir de operadores predefinidos y definidos por el usuario que cumplen ciertos requisitos, como se describe a continuación:
- Para los operadores unarios
+ ++ - -- ! ~
+ ++ - -- ! ~
existe una forma elevada de un operador si los tipos de operando y resultado son ambos tipos de valores no anulables. La forma levantada se construye agregando un solo?
modificador para el operando y los tipos de resultados. El operador elevado produce un valor nulo si el operando es nulo. De lo contrario, el operador elevado desenvuelve el operando, aplica el operador subyacente y envuelve el resultado.
Entonces, básicamente,
a++
en este caso es una expresión con un resultado
null
(como un
int?
) Y la variable se deja intacta.
Cuando usted llama
Console.WriteLine(a);
se está encuadrando en un
object
, que lo convierte en una referencia nula, que se imprime como una línea vacía.
La respuesta de Jon es correcta, pero agregaría algunas notas adicionales.
¿Por qué
Console.WriteLine(null)
da un error de compilación?
Hay 19 sobrecargas de
Console.WriteLine
y tres de ellas son aplicables a un
null
: el que toma una
string
, el que toma un
char[]
y el que toma un
object
.
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.
¿Por qué
Console.WriteLine(a)
escribe una línea vacía?
a
es un
int?
nulo
int?
.
La resolución de sobrecarga elige la versión del
object
del método, por lo que el
int?
está encuadrado en una referencia nula.
Entonces, esto es básicamente lo mismo que
Console.WriteLine((object)null)
, que escribe una línea vacía.
¿Por qué no hay
NullReferenceException
en el incremento?
¿Dónde está la
referencia
nula que le preocupa?
a
es un
int?
nulo
int?
que no es un tipo de referencia para empezar!
Recuerde, los tipos de valores anulables son tipos de
valores
, 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.