Activé esta función en un proyecto que tiene clases de objetos de transferencia de datos (DTO), como se indica a continuación:
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
Pero me sale el error:
CS8618
: La propiedad no anulable 'ServiceUrl' no está inicializada. Considere declarar la propiedad como anulable.
Esta es una clase DTO, por lo que no estoy inicializando las propiedades. Esto será responsabilidad del código que inicializa la clase para garantizar que las propiedades no sean nulas.
Por ejemplo, la persona que llama puede hacer:
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
Mi pregunta: ¿Cómo manejar tales errores en las clases DTO cuando el contexto de nulabilidad de C # 8 está habilitado?
Plain Old C# Object
. Solo un objeto como cualquier otro, sin heredar de ninguna clase especial. Sospecho que tienes una pregunta diferente . Cómo crear DTOs -Data Transfer Objects
This should be the responsibility of the one initializing the class to ensure that the properties are non-null
la clase debe estar en un estado válido siempre. Sinull
no está permitido, la propiedad nunca debe ser nula. Tal vez, en lugar de una cadena básica, debería usar una clase especializada para la URL que pueda tener un valor deNone
'Falta', como la clase Opción en F #. C # 8 le permite escribir tales clases y verificarlas con coincidencia de patronespublic string ServiceUrl { get; set; } = default! ;
. Espero que Roslyn pueda tener en el futuro una forma de manejar la inicialización tardía fuera del alcance de ctor. Estaba usando MayBe <T> (como la clase Opción), pero cambié a Tipo de referencia anulable en c # 8 para el nuevo código.Respuestas:
La siguiente solución es recomendada por EF Core y EF6 ver
1) Inicializando a
null!
con el operador indulgente2) Uso del campo de respaldo:
fuente
!
operador.Si no es anulable, ¿qué puede hacer el compilador cuando se inicializa el objeto?
El valor predeterminado de la cadena es nulo, por lo que
o bien debe asignar un valor predeterminado de cadena en la declaración
public string ServiceUrl { get; set; } = String.Empty;
O inicialice el valor en el constructor predeterminado para deshacerse de la advertencia
Usa el
!
operador (que no puedes usar)Que sea anulable como robbpriestley mencionó.
fuente
ServiceUrl'
no puede ser = String.Empty. Hay otras propiedades de tipo complejo que no pueden ser nulas, por lo que utilicédefault
como: 'public MyClass MyProperty {get; conjunto; } = predeterminado! 'para detener la advertencia. Esta clase (y otras) es un constructor sin parámetros y últimamente se inicializa fuera del alcance de ctor.Otra cosa que puede ser útil en algunos escenarios:
Se puede usar encima del miembro o del tipo completo.
Otra cosa a tener en cuenta es agregar
#nullable disable
encima del archivo para deshabilitar la referencia anulable para todo el archivo.fuente