Dictionary.TryGetValue
andで例示されるC#クラスにはパターンがありint.TryParse
ます。操作の成功を示すブール値と実際の結果を含む出力パラメーターを返すメソッド。操作が失敗した場合、outパラメーターはnullに設定されます。
C#8のnull不可の参照を使用しており、自分のクラスのTryParseメソッドを記述したいとします。正しい署名はこれです:
public static bool TryParse(string s, out MyClass? result);
falseの場合、結果はnullであるため、out変数はnull可能としてマークする必要があります。
ただし、一般的にTryパターンは次のように使用されます。
if (MyClass.TryParse(s, out var result))
{
// use result here
}
操作が成功したときにのみブランチに入るため、そのブランチで結果がnullになることはありません。しかし、null可能としてマークしたので、それを確認するか!
、オーバーライドに使用する必要があります。
if (MyClass.TryParse(s, out var result))
{
Console.WriteLine("Look: {0}", result.SomeProperty); // compiler warning, could be null
Console.WriteLine("Look: {0}", result!.SomeProperty); // need override
}
これは見苦しく、少し人間工学的ではありません。
典型的な使用パターンのため、別のオプションがあります:結果タイプについてうそをつきます:
public static bool TryParse(string s, out MyClass result) // not nullable
{
// Happy path sets result to non-null and returns true.
// Error path does this:
result = null!; // override compiler complaint
return false;
}
今、典型的な使用法はより良くなります:
if (MyClass.TryParse(s, out var result))
{
Console.WriteLine("Look: {0}", result.SomeProperty); // no warning
}
しかし、非典型的な使用法では警告が表示されません。
else
{
Console.WriteLine("Fail: {0}", result.SomeProperty);
// Yes, result is in scope here. No, it will never be non-null.
// Yes, it will throw. No, the compiler won't warn about it.
}
今、私はどちらの方法でここに行くのか分かりません。C#言語チームから公式の推奨事項はありますか?これを行う方法を示す可能性のあるnull不可の参照に既に変換されているCoreFXコードはありますか?(TryParse
メソッドを探しに行きましたIPAddress
。1つのクラスがありますが、corefxのmasterブランチでは変換されていません。)
そして、汎用コードDictionary.TryGetValue
はこれをどのように処理しますか?(おそらく、MaybeNull
私が見つけたものからの特別な属性を使用して。)Dictionary
nullを許可しない値型でをインスタンス化するとどうなりますか?
MyClass?
)、そしてcase MyClass myObj:
(and optionall)で切り替えますcase null:
。