¿Cuál es el propósito de un signo de interrogación después de un tipo (por ejemplo: int? MyVariable)?

Por lo general, el uso principal del signo de interrogación es para el condicional, x ? "yes" : "no" x ? "yes" : "no" .

Pero he visto otro uso para él, pero no puedo encontrar una explicación de este uso del ? operador, por ejemplo.

 public int? myProperty { get; set; } 

Significa que el tipo de valor en cuestión es un tipo anulable

Los tipos anulables son instancias de la estructura System.Nullable. Un tipo anulable puede representar el rango correcto de valores para su tipo de valor subyacente, más un valor nulo adicional. Por ejemplo, a un Nullable, pronunciado “Nullable de Int32”, se le puede asignar cualquier valor de -2147483648 a 2147483647, o se le puede asignar el valor nulo. A Nullable se les puede asignar los valores true, false o null. La capacidad de asignar nulo a los tipos numéricos y booleanos es especialmente útil cuando se trata de bases de datos y otros tipos de datos que contienen elementos a los que no se les puede asignar un valor. Por ejemplo, un campo booleano en una base de datos puede almacenar los valores como verdaderos o falsos, o puede no estar definido.

 class NullableExample { static void Main() { int? num = null; // Is the HasValue property true? if (num.HasValue) { System.Console.WriteLine("num = " + num.Value); } else { System.Console.WriteLine("num = Null"); } // y is set to zero int y = num.GetValueOrDefault(); // num.Value throws an InvalidOperationException if num.HasValue is false try { y = num.Value; } catch (System.InvalidOperationException e) { System.Console.WriteLine(e.Message); } } } 

Es una abreviatura de Nullable . Nullable se usa con tipos de valores que no pueden ser nulos.

En

 x ? "yes" : "no" 

el ? declara una oración if . Aquí: x representa la condición booleana; La parte anterior a : es la oración a continuación y la parte posterior es la oración else .

En, por ejemplo,

 int? 

el ? declara un tipo que admite nulos, y significa que el tipo anterior puede tener un valor nulo.

Tipos anulables

Los tipos anulables son instancias de la estructura System.Nullable. Un tipo que admite nulos puede representar el rango normal de valores para su tipo de valor subyacente, más un valor nulo adicional . Por ejemplo, a [ Nullable ], pronunciado “Nullable de Int32”, se le puede asignar cualquier valor desde -2147483648 a 2147483647, o se le puede asignar el valor nulo. A [ Nullable ] se le pueden asignar los valores verdadero o falso, o nulo. La capacidad de asignar null a tipos numéricos y booleanos es particularmente útil cuando se trata de bases de datos y otros tipos de datos que contienen elementos a los que no se les puede asignar un valor. Por ejemplo, un campo booleano en una base de datos puede almacenar los valores como verdaderos o falsos, o puede no estar definido.

declara que el tipo es anulable.

uso práctico:

 public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value) { if (value == null) { return "bad value"; } return someFunctionThatHandlesIntAndReturnsString(value); } 

Para agregar a las respuestas anteriores, aquí hay una muestra de código

 struct Test { int something; } struct NullableTest { int something; } class Example { public void Demo() { Test t = new Test(); t = null; NullableTest? t2 = new NullableTest(); t2 = null; } } 

Esto daría un error de comstackción:

Error 12 No se puede convertir nulo en ‘Prueba’ porque es un tipo de valor que no admite nulos

Tenga en cuenta que no existe un error de comstackción para NullableTest. (nota el? en la statement de t2)

Para crear un opcional, añada un ? después del tipo que deseas envolver Cualquier tipo puede ser opcional, incluso sus propios tipos personalizados. No puedes tener un espacio entre el tipo y el ? .

 var name: String? = "Bob" // Create an optional String that contains "Bob" var peter: Person? = Person() // An optional "Person" (custom type) // A class with a String and an optional String property class Car { var modelName: String // must exist var internalName: String? // may or may not exist }