Considere el método System.Text.Json.JsonSerializer.Deserialize de .NET 6 y sus muchas sobrecargas.
¿Cada uno devuelve cualquier object? o valor de TValue? lo que indica que se podría devolver un null . Sin embargo, la documentación establece que en caso de error, se lanza una excepción. Además, también establece que se devuelve un valor válido (si no se lanza una excepción). En ninguna parte dice que se puede devolver null . Y en mi experiencia de usarlo, nunca se devuelve null .
(El tipo de retorno anulable es un problema si activa la "capacidad de nulo" en su proyecto, porque el compilador luego comienza a advertirle que el valor devuelto podría ser nulo , lo que en mi experiencia (y de acuerdo con la documentación) simplemente no es cierto . Es este tipo de cosas lo que me hace apresurarme a desactivar la anulabilidad de nuevo. Sé que puedo suprimir la advertencia, pero no creo que ese sea el punto).
¿Falta la documentación? ¿Pueden los métodos realmente devolver nulo? Si no pueden, ¿por qué tenemos tipos de retorno anulables?
De acuerdo con RFC 7159, "null" (y "true" y "false") será un texto JSON válido. Sin embargo, la cadena vacía no es un JSON válido.
TValue? Deserialize<TValue> es solo un contenedor para Object? Deserialize(type: typeof(TValue)) .#nullable a C# 8.0, el tipo System.Type no se amplió con soporte para esas anotaciones.Nullable<T> , por supuesto)Deserialize<TValue>() usando TValue := MyClass? o TValue := MyClass se comportará de manera idéntica porque el método Deserialize no tiene idea si MyClass tiene el ? anotación o no.Deserialize<TValue> solo sabe si TValue es un tipo de referencia o no (a través de typeof(TValue) ).JsonSerializer que deserialice la cadena "null" (que es JSON válido ) y si TValue es un tipo de referencia, devolverá null .TValue no tiene ? . ¡Recuerde que JsonSerializer no sabe (y no puede) saber eso!? anotación, porque si no fuera así, estaría afirmando incorrectamente que nunca devuelve null . Se puede argumentar que los diseñadores de JsonSerialize podrían haber agregado algunos métodos más que permitieran a las personas que llaman afirmar estáticamente que no son nulos, pero no lo hicieron, pero usted puede hacerlo si realmente lo desea:
Al igual que:
public static TValue DeserializeNonNullObject<TValue>( String json ) where TValue : class { TValue? orNull = JsonSerializer.Deserialize<TValue>( json ); return orNull ?? throw new JsonException( "Expected deserialized object to be non-null, but encountered null." ); }