Nullable vs. int? – ¿Hay alguna diferencia?

Aparentemente Nullable e int? son equivalentes en valor ¿Hay alguna razón para elegir una sobre la otra?

 Nullable a = null; int? b = null; a == b; // this is true 

Ninguna diferencia.

int? es solo una abreviatura de Nullable , que en sí es una abreviatura de Nullable .

El código comstackdo será exactamente el mismo que elija usar.

El ? la forma es solo una abreviatura para el tipo completo. La preferencia personal es la única razón para elegir una sobre la otra.

Todos los detalles aquí .

La syntax T? es una abreviatura de Nullable , donde T es un tipo de valor. Las dos formas son intercambiables.

Aunque estoy totalmente de acuerdo en que en la mayoría de los casos son los mismos, hace poco encontré una situación, cuando hay una diferencia entre esos dos. Para los detalles sangrientos, vea esta pregunta , pero para darle un rápido ejemplo aquí:

 void Test(T a, bool b) { var test = a is int? & b; // does not compile var test2 = a is Nullable & b; // does compile } 

La primera línea muestra los siguientes mensajes de error:

 error CS1003: Syntax error, ':' expected error CS1525: Invalid expression term ';' 

Si tiene curiosidad acerca de 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 operador is (o un operador as ), ¿cuándo enfrentamos un ? token verificamos si el siguiente token puede interpretarse como un operador unario ( & podría ser uno) y si es así: ¿al analizador no le importa la posibilidad del ? token es un modificador de tipo, simplemente usa el tipo anterior, y analizará el rest como si fuera el ? token era un operador ternario (por lo tanto, el análisis fallará).

Entonces, mientras que en general int? y Nullable son intercambiables, existen algunos casos de esquina cuando producen resultados completamente diferentes, debido a la forma en que el analizador ve su código.

Aparentemente hay una diferencia entre los dos al usar la generación de Entity Framework (EF) con el código primero.

Cuando su entidad contiene una propiedad declarada como:

 public class MyEntity { public Nullable MyNullableInt { get; set; } } 

EF no generará una propiedad que se pueda anular y tendrás que forzar al generador para que se pueda anular de esta manera:

 public class YourContext : DbContext { public DbSet MyEntities{ get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().Property(x => x.MyNullableInt).IsOptional(); } } 

Por otro lado, si declaras tu entidad como:

 public class MyEntity { public int? MyNullableInt { get; set; } } 

el generador de EF generará una propiedad que puede ser anulada con un campo que puede ser anulado en la tabla correspondiente de la base de datos.

Nullable es un tipo genérico, pero int? no es.

Hay algunos escenarios donde Nullable se debe usar sobre int?

por ejemplo: aquí no puede reemplazar Nullable con int?

¿Cómo puedes cambiar el código a continuación sin usar Nullable ?

 class LazyValue where T : struct { private Nullable val; private Func getValue; // Constructor. public LazyValue(Func func) { val = null; getValue = func; } public T Value { get { if (val == null) // Execute the delegate. val = getValue(); return (T)val; } } }