J'ai activé cette fonctionnalité dans un projet ayant des classes d'objets de transfert de données (DTO), comme indiqué ci-dessous:
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
Mais je reçois l'erreur:
CS8618
: La propriété non nullable 'ServiceUrl' n'est pas initialisée. Envisagez de déclarer la propriété comme nullable.
Ceci est une classe DTO, donc je n'initialise pas les propriétés. Ce sera la responsabilité du code initialisant la classe pour s'assurer que les propriétés ne sont pas nulles.
Par exemple, l'appelant peut faire:
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
Ma question: comment gérer ces erreurs dans les classes DTO lorsque le contexte de nullité C # 8 est activé?
Plain Old C# Object
. Juste un objet comme un autre, sans hériter d'aucune classe spéciale. Je soupçonne que vous avez une question différente . Comment créer des DTO -Data Transfer Objects
This should be the responsibility of the one initializing the class to ensure that the properties are non-null
la classe doit toujours être dans un état valide. Si cenull
n'est pas autorisé, la propriété ne doit jamais être nulle. Peut-être, au lieu d'une chaîne de base, vous devriez utiliser une classe spécialisée pour l'URL qui peut avoir une valeur deNone
ou «manquant», comme la classe Option en F #. C # 8 vous permet d'écrire de telles classes et de les vérifier avec la correspondance de motifspublic string ServiceUrl { get; set; } = default! ;
. J'espère que Roslyn aura à l'avenir un moyen de gérer l'initialisation tardive en dehors du champ d'application de ctor. J'utilisais MayBe <T> (comme la classe Option), mais je suis passé au type de référence nullable en c # 8 pour le nouveau code.Réponses:
La solution suivante est recommandée par EF Core & EF6 voir
1) En initialisant
null!
avec l'opérateur pardonnant2) Utilisation du champ de support:
la source
!
opérateur.S'il n'est pas nullable, que peut faire le compilateur lorsque l'objet est initialisé?
La valeur par défaut de la chaîne est nulle, vous
soit besoin d'attribuer une valeur par défaut de chaîne dans la déclaration
public string ServiceUrl { get; set; } = String.Empty;
Ou initialisez la valeur dans le constructeur par défaut afin de vous débarrasser de l'avertissement
Utilisez l'
!
opérateur (que vous ne pouvez pas utiliser)Rendez-le nul comme l'a mentionné robbpriestley.
la source
ServiceUrl'
ne peut pas être = String.Empty. Il existe d'autres propriétés de type complexe qui ne peuvent pas être nulles, j'ai donc utilisédefault
comme: 'public MyClass MyProperty {get; ensemble; } = par défaut! 'pour arrêter l'avertissement. Cette classe (et d'autres) est un constructeur sans paramètre et est récemment initialisée en dehors de la portée de ctor.Une autre chose qui pourrait être utile dans certains scénarios:
Peut être utilisé au-dessus d'un membre ou d'un type entier.
Encore une autre chose à considérer est d'ajouter
#nullable disable
au-dessus du fichier pour désactiver la référence nullable pour tout le fichier.la source