Question
以下のメソッドは、trueを返す場合はvalue
に非nullの値を格納し、falseを返す場合はnullを格納する。
boolTryGetValue(stringkey,outstringvalue){...}
では、このメソッドは、null許容参照型の導入時にどう変化させなければならないか。
boolTryGetValue(stringkey,outstring?value){...}
と書いてしまうと、呼び出し側で面倒なことになる。
if(TryGetValue("hoge",outstring?value){// nullを許容しない引数のメソッドに渡す際、!演算子が必要になるDisallowNullMethod(value!);}
Answer
NotNullWhen
属性、あるいは、MaybeNullWhen
属性をout引数に付ける。
boolTryGetValue(stringkey,[NotNullWhen(true)]outstring?value){...}
boolTryGetValue(stringkey,[MaybeNullWhen(false)]outstringvalue){...}
下の場合、引数の型がnullを許容しない型になるが、メソッド内ではout引数にnullを代入できる。
こう書いておくと、このメソッドがtrueを返したコンテキストに限り、value
の値をnull非許容としてあつかえる。
// メソッドを呼び出す際は、null許容型な必要があるif(TryGetValue("hoge",outstring?value){// ここではvalueをnull非許容として扱えるDisallowNullMethod(value);}
参考にした情報
https://stackoverflow.com/questions/55526064/trygetvalue-pattern-with-c-sharp-8-nullable-reference-types
https://www.misuzilla.org/Blog/2019/09/25/NullableReferenceTypes