web-dev-qa-db-fra.com

Puis-je dire aux références nullables C # qu'une méthode est effectivement une vérification nulle sur un champ

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.

14
John Melville

J'ai regardé les différents attributs de System.Diagnostics.CodeAnalysis et je n'ai rien trouvé d'application, ce qui est très décevant. Le plus proche de ce que vous voulez semble être:

public bool TryGetName([NotNullWhen(true)] out string? name)
{
    name = Name;
    return name != null;
}

public void NameToUpperCase()
{
    if (TryGetName(out var name))
    {
        Name = name.ToUpper();
    }
}

Ça a l'air assez lourd, je sais. Vous pouvez regarder les documents MSDN pour les attributs nullables , vous trouverez peut-être quelque chose de plus propre.

3
V0ldek