Pregunta

Considere las siguientes afirmaciones:

int? v1 = null;

int? v2 = 5 * v1;

¿Cuál es el valor de v2? (null o cadena vacía?)

¿Cómo puedo evitar que el compilador lo marque como una operación no válida? ¿Necesito seguir el manejo de excepciones personalizadas?

¿Fue útil?

Solución

Es null.

C# Especificación del lenguaje 3.0 (sección §7.2.7: operadores elevados)

Para los operadores binarios + - * / % & | ^ << >> :

Existe una forma elevada de un operador si los tipos de operando y resultados son tipos de valor no anulables. La forma elevada se construye agregando un solo ? Modificador a cada operando y tipo de resultado. El operador elevado produce un null valor si uno o ambos operandos son null (una excepción es la & y | operadores del bool? Tipo, como se describe en §7.10.3). De lo contrario, el operador elevado desenvuelve los operandos, aplica el operador subyacente y envuelve el resultado.


¿Cómo puedo evitar que el compilador lo marque como una operación no válida? ¿Necesito seguir el manejo de excepciones personalizadas?

No es una operación inválida. No lanzará una excepción para que no necesite manejar excepciones en este caso.

Otros consejos

Si desea que el compilador evite la operación, haga que la segunda variable no sea anulable. Entonces te verás obligado a escribir:

int v2 = 5 * v1.Value;

Esto lanzará una excepción en el tiempo de ejecución si V1 es nulo.

Su valor será "nulo", en este contexto, al menos puede considerarse el mismo que una base de datos nula, es decir, en lugar de nada, o cero, significa "desconocido". Todavía se desconoce cinco lotes desconocidos, que nunca será "cadena vacía", ya que estás lidiando con números, no en cadenas.

No estoy seguro de a qué te refieres con "¿Cómo puedo evitar que el compilador lo marque como una operación no válida?" Como este código se compila y funciona bien para mí en Visual Studio 2008 =)

No estoy seguro de lo que está tratando de hacer, pero si desea que V2 sea nulo si V1 es nulo, entonces debe probar si V1 tiene un valor antes de usarlo.

int? v2 = v1.HasValue ? 5 * v1.Value : null;

o

int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top