次のコードを検討してください。
#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可能な参照チェッカーが機能しなくなるようです。
私はあなたのために、あなたはコードを
—
GaryNg
#nullable disable
その時#nullable enable
またはその後でラップすることができると思いますrestore
(docs.microsoft.com/en-us/dotnet/csharp/…)。
「dammit」
—
Jan Paolo Go
!
演算子を使用できます。if(HasName) { Name = Name!.ToUpper(); }
マルチスレッドアプリケーションの場合、HasNameチェックの後にNameをnullにして、プロパティに戻る代わりにローカルで変数を使用すると(プロパティがゲッターで何を行うかを知っている)、いくつかのファンキーなバグが発生します(覚えておいてください)これが多く発生したイベントハンドラーの使用)
—
XIU
HasValue
は、null許容型で使用する必要がありますnull
。チェックしないでください。それはおそらくあなたの問題に影響を与えません。