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 parav2
, que en este caso esint
. De ello se deduce que cuando el valor parav1
esnull
, la condición if fallará ya que no se puede asignar un nulo a unint
. Más adecuadamente,null
no es unint
.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);