Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

155
Vistas
¿Por qué los tipos de retorno de los métodos System.Text.Json.JsonSerializer.Deserialize de .NET son anulables cuando no devuelven nulo?

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?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

  • TValue? Deserialize<TValue> es solo un contenedor para Object? Deserialize(type: typeof(TValue)) .
  • Cuando se agregaron anotaciones #nullable a C# 8.0, el tipo System.Type no se amplió con soporte para esas anotaciones.
    • Por lo tanto, no es posible que un tipo genérico en C# sepa (en tiempo de ejecución) si el argumento de tipo concreto de un parámetro de tipo genérico es un tipo de referencia anulable o un tipo de referencia no anulable.
      • (Esto no se aplica a Nullable<T> , por supuesto)
  • Entonces, en tiempo de ejecución, un sitio de llamada para 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.
    • El Deserialize<TValue> solo sabe si TValue es un tipo de referencia o no (a través de typeof(TValue) ).
  • Por lo tanto, si le indica a JsonSerializer que deserialice la cadena "null" (que es JSON válido ) y si TValue es un tipo de referencia, devolverá null .
    • ... incluso si su TValue no tiene ? . ¡Recuerde que JsonSerializer no sabe (y no puede) saber eso!
  • ¿Cuál es la razón por la cual el tipo de retorno estático del método tiene el ? 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." ); }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda