with float convert comprobar c# .net nullable

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.