Aparentemente Nullable<int>
y int?
son equivalentes en valor. ¿Hay alguna razón para elegir una u otra?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
Ninguna diferencia.
int?
es una abreviatura de Nullable<int>
, que en sí misma es una abreviatura de Nullable<Int32>
.
El código compilado será exactamente el mismo, cualquiera que elija utilizar.
El
?
formulario es solo una abreviatura del tipo completo. La preferencia personal es la única razón para elegir uno sobre el otro.Detalles completos aquí .
fuente
Si bien estoy totalmente de acuerdo en que en la mayoría de los casos son los mismos, hace poco encontré con una situación, cuando no es una diferencia entre los dos. Para los detalles sangrientos, vea esta pregunta , pero para darle un ejemplo rápido aquí:
La primera línea muestra los siguientes mensajes de error:
Si tiene curiosidad sobre la razón exacta de esto, realmente le recomiendo que revise la pregunta ya vinculada , pero el problema básico es que en la fase de análisis después de un
is
(o unas
) operador, cuando nos enfrentamos a un?
token, verificamos si el siguiente token se puede interpretar como un operador unario (&
podría ser uno) y, de ser así: al analizador no le importa la posibilidad de que el?
token sea un modificador de tipo, simplemente usa el tipo anterior y analizará el resto como si el?
token era un operador ternario (por lo tanto, el análisis fallará).Entonces, aunque en general
int?
yNullable<int>
son intercambiables, hay algunos casos extremos en los que producen resultados completamente diferentes, debido a cómo el analizador ve su código.fuente
test
se fija entre paréntesis, entoncesvar test = (a is int?) & b;
. También se puede fijar convar test = a is int? && b;
, y dado queb
es un parámetro de valor simple (sin efectos secundarios sobre la evaluación) que parece extraño a preferir&
más&&
.?
es un personaje clave.int?
como una operación ternaria (var test = a is int? <return if true> : <return if false>
), no como un int que acepta valores NULL.bool
sobrecargas en particular . Estos son los operadores lógicos booleanos (el&
parabool
) y los operadores lógicos condicionales booleanos (el&&
parabool
). Observe cómo la primera de estas subsecciones se llama claramente lógica . Recuerde, en C # no hay conversiones ("conversiones") entrebool
y tipos numéricos.Aparentemente, hay una diferencia entre los dos cuando se usa la generación de Entity Framework (EF) de código primero:
Cuando su entidad contiene una propiedad declarada como:
EF no generará una propiedad anulable y tendrá que forzar al generador para que sea anulable así:
Por otro lado, si declara su entidad como:
el generador de EF generará una propiedad anulable con un campo anulable en la tabla de base de datos correspondiente.
fuente
Nullable
definición en alguna parte, porque con el incorporadoNullable<T>
, EF no puede ver la diferencia entre los dos. Incluso si la gente de EF quisiera tratarlos de manera diferente, no podrían.Nullable es un tipo genérico, pero int? no es.
¿Hay algunos escenarios en los que Nullable debería usarse sobre int?
por ejemplo: aquí no se puede reemplazar Nullable con int?
¿Cómo puede cambiar el siguiente código sin usar Nullable ?
fuente
Nullable<T>
lo esNullable<int>