次のコードを検討してください。
#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可能な参照チェッカーが壊れるようです。
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ドキュメント を見ることができます、おそらくあなたはもっときちんとした何かを見つけるでしょう。