with operator comprobar c# nullable

operator - Cómo convertir C#nullable int a int



public nullable int (15)

¿Cómo convierto un int anulable a un int ? Supongamos que tengo 2 tipos de int como a continuación:

int? v1; int v2;

Quiero asignar el valor de v1 a v2 . v2 = v1; causará un error. ¿Cómo convierto v1 a v2 ?


GetValueOrDefault()

recupera el valor del objeto. Si es nulo, devuelve el valor predeterminado de int, que es 0.

Ejemplo:

v2= v1.GetValueOrDefault();


Asignará el valor de v1 a v2 si no es nulo, de lo contrario tomará un valor predeterminado como cero.

v2=v1??0

O abajo está la otra forma de escribirlo.

v2 = v1.HasValue?v1:0


Dependiendo de su contexto de uso, puede usar la función de coincidencia de patrones de C # 7:

int? v1 = 100; if (v1 is int v2) { Console.WriteLine($"I''m not nullable anymore: {v2}"); }

EDITAR:

Como algunas personas votan a la baja sin dejar una explicación, me gustaría agregar algunos detalles para explicar la razón para incluir esto como una solución viable.

  • La coincidencia de patrones de C # 7 ahora nos permite verificar el tipo de valor y emitirlo implícitamente. En el fragmento de código anterior, la condición if solo pasará cuando el valor almacenado en v1 sea ​​compatible con el tipo para v2 , que en este caso es int . De ello se deduce que cuando el valor para v1 es null , la condición if fallará ya que no se puede asignar un nulo a un int . Más adecuadamente, null no es un int .

  • Me gustaría destacar que la solución puede no ser siempre la opción óptima. Como sugiero, creo que esto dependerá del contexto de uso exacto del desarrollador. Si ya tienes un int? y desea operar de manera condicional en su valor if-and-only-si el valor asignado no es nulo (esta es la única vez que es seguro convertir un int. De las formas más concisas para hacer esto.


En lo que a mí respecta, la mejor solución es usar el método GetValueOrDefault() .

v2 = v1.GetValueOrDefault();


La conversión int nullable a int se puede hacer así:

v2=(int)v1;


Las otras respuestas hasta ahora son todas correctas; Solo quería añadir uno más que sea un poco más limpio:

v2 = v1 ?? default(int);

Cualquier Nullable<T> se puede convertir implícitamente a su T , SIEMPRE que la expresión completa que se está evaluando nunca puede dar como resultado una asignación nula a un ValueType. Entonces, ¿el operador de unión nula ?? es solo sintaxis de azúcar para el operador ternario:

v2 = v1 == null ? default(int) : v1;

... que a su vez es sintaxis de azúcar para un if / else:

if(v1==null) v2 = default(int); else v2 = v1;

Además, a partir de .NET 4.0, Nullable<T> tiene un método "GetValueOrDefault ()", que es un captador seguro para nulos que básicamente realiza la fusión nula que se muestra arriba, así que esto también funciona:

v2 = v1.GetValueOrDefault();


Me gusta esto,

if(v1.HasValue) v2=v1.Value


No puede hacerlo si la v1 es nula, pero puede consultar con un operador.

v2 = v1 ?? -1;


Podrías hacerlo

v2 = v1.HasValue ? v1.Value : v2;


Puede utilizar la propiedad Valor para la asignación.

v2 = v1.Value;


Si el valor predeterminado para un tipo dado es un resultado aceptable:

if (v1.HasValue) v2 = v1.GetValueOrDefault();

Si desea un valor predeterminado diferente cuando el resultado no está definido:

v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255

Si solo desea que se devuelva el valor (no importa si el método falló o no):

v2 = v1.GetValueOrDefault();


.NET 4.7.2 .: GetValueOrDefault() devuelve el valor del campo sin ninguna comprobación.


Si sabe que v1 tiene un valor, puede usar la propiedad Value :

v2 = v1 ?? 0;

El uso del método GetValueOrDefault asignará el valor si hay uno, de lo contrario, el valor predeterminado para el tipo, o un valor predeterminado que especifique:

v2 = v1.Value;

Puede usar la propiedad HasValue para verificar si v1 tiene un valor:

v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value

También hay soporte de idioma para el método GetValueOrDefault(T) :

if (v1.HasValue) { v2 = v1.Value; }


Todo lo que necesitas es..

v2= v1.GetValueOrDefault();


Una conversión simple entre v1 y v2 no es posible porque v1 tiene un dominio de valores más grande que v2 . Es todo lo que v1 puede contener más el estado null . Para convertir, debe indicar explícitamente qué valor en int se utilizará para asignar el estado null . La forma más sencilla de hacer esto es el ?? operador

v2 = v1 ?? 0; // maps null of v1 to 0

Esto también se puede hacer en forma larga.

int v2; if (v1.HasValue) { v2 = v1.Value; } else { v2 = 0; }


es posible con v2 = Convert.ToInt32(v1);