web-dev-qa-db-ja.com

C#のnull可能な参照に、メソッドが事実上フィールドのnullチェックであることを通知できますか

次のコードを検討してください。

#nullable enable
class Foo
{
    public string? Name { get; set; }
    public bool HasName => Name != null;
    public void NameToUpperCase()
    {
        if (HasName)
        {
            Name = Name.ToUpper();
        }
    }
}

Name = Name.ToUpper()で、Nameがnull参照の可能性があるという警告が表示されますが、これは明らかに正しくありません。 HasNameをインライン化することでこの警告を解決できるので、条件は(Name!= null)になります。

HasNameからの真の応答がNameにnull以外の制約を含むことをコンパイラーに指示する方法はありますか?

HasNameは実際により多くのことをテストする可能性があり、いくつかの場所で使用したり、APIサーフェイスのパブリック部分になる可能性があるため、これは重要です。 nullチェックを独自のメソッドに組み込む理由はたくさんありますが、そうすることでnull可能な参照チェッカーが壊れるようです。

14
John Melville

System.Diagnostics.CodeAnalysisのさまざまな属性を確認したところ、該当するものが見つからなかったため、非常に残念です。あなたが望むものに到達できる最も近いものは次のようです:

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

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

かなり扱いにくいように見えます。あなたは nullable属性のMSDNドキュメント を見ることができます、おそらくあなたはもっときちんとした何かを見つけるでしょう。

3
V0ldek