Considérez le code suivant:
#nullable enable
class Foo
{
public string? Name { get; set; }
public bool HasName => Name != null;
public void NameToUpperCase()
{
if (HasName)
{
Name = Name.ToUpper();
}
}
}
Sur Name = Name.ToUpper (), je reçois un avertissement indiquant que Name est une référence null possible, ce qui est clairement incorrect. Je peux remédier à cet avertissement en insérant HasName afin que la condition soit if (Name! = Null).
Existe-t-il un moyen de dire au compilateur qu'une vraie réponse de HasName implique une contrainte de non-nullité sur Name?
Ceci est important car HasName pourrait en fait tester beaucoup plus de choses, et je pourrais vouloir l'utiliser à plusieurs endroits, ou il pourrait être une partie publique de la surface de l'API. Il existe de nombreuses raisons de vouloir factoriser la vérification nulle dans sa propre méthode, mais cela semble casser le vérificateur de référence nullable.
la source
HasValue
sur un type nullable, ne pas le vérifiernull
. Cela n'affecte probablement pas votre problème.#nullable disable
puis#nullable enable
ourestore
encore par la suite ( docs.microsoft.com/en-us/dotnet/csharp/... ).!
opérateur "dammit" .if(HasName) { Name = Name!.ToUpper(); }
Réponses:
J'ai regardé les différents attributs de
System.Diagnostics.CodeAnalysis
et je n'ai rien trouvé qui soit applicable, ce qui est très décevant. Le plus proche de ce que vous voulez semble être:Ça a l'air assez lourd, je sais. Vous pouvez consulter les documents MSDN pour les attributs nullables , peut-être trouverez-vous quelque chose de plus propre.
la source
if(Name != null) return Null.ToUpper()
, il n'y aura aucun avertissement pour une déréférence nulle, même s'il s'agit techniquement d'une condition de concurrence TOCTOU. Je me souviens que Mads Torgersen parlait de la façon dont ils considéraient cela, mais cela générerait tellement de faux positifs que la fonctionnalité entière des types de référence annulables serait effectivement inutile - 99% du temps, vos propriétés ne seront pas modifiées par un autre thread. Donc, tout ce que vous avez à faire est de créer un attribut qui ferait que la vérification de cette propriété soit traitée comme une vérification de null sur une autre propriété.La chaîne est un type de référence et nullable (par exemple
int?
) est un type de valeur nullable. Vous ne pouvez donc pas vraiment faire celastring? myString
; Vous avez besoin de ceci:la source