Siempre he sabido en C# que puede representar tipos anulables de varias maneras, y la diferencia a menudo se describe como "azúcar sintáctico". Por ejemplo, el siguiente...
// Case 1 int? nullableIntegerVar01; // Case #2 - System.Nullable<int> nullableIntegerVar02; // Case #3 - Uri? nullableUriVar01; // Case #4 System.Nullable<Uri> nullableUriVar02;Curiosamente, el caso n. ° 4 anterior no se compila y arroja el siguiente error.
"Error CS0453 El tipo 'Uri' debe ser un tipo de valor no anulable para usarlo como parámetro 'T' en el tipo o método genérico 'Anulable'"
Entiendo el error, no entiendo el razonamiento: esperaba que estos dos métodos para definir tipos anulables fueran intercambiables.
Además, lo siguiente no funciona.
var testType = typeof(Uri); var testNullableType = typeof(Nullable<>).MakeGenericType(testType);¿Alguien puede proporcionar información?
Para tipos de valor, como int o structs (que normalmente nunca pueden ser nulos), x? es equivalente a Nullable<x> (azúcar sintáctico), y crea un nuevo tipo. Para tipos de referencia como Uri, el ? solo sirve como una anotación, no crea un nuevo tipo (estos pueden ser nulos independientemente de la presencia del marcador ?).
Documentos:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types