Visual Basic 9.0になって三項演算子的な使い方ができるIf演算子の登場とnull許容値型の宣言が可能になりました。
さて、次のコードの結果はどうなるでしょう。
Dim n As Integer?
' 1
n = If(True, Nothing, 0)
Console.WriteLine(n.HasValue)
' 2
n = If(True, Nothing, Nothing)
Console.WriteLine(n.HasValue)
' 3
n = Nothing
n = If(n, Nothing)
Console.WriteLine(n.HasValue)
結果は
になります。わかりました?
1は、Ifの第1引数がTrueなので、第2引数のNothingがnに代入されます。2も同様に、第2引数のNothingがnに代入されます。両方ともNothingが代入されてますが1はTrue、2はFalseになってしまいました。
If演算子では第2引数と第3引数の値によって返る型が決定されるようで、1の場合はNothingと0なのでInteger型になりNothingは0として扱われ n=0 になります。2の場合はInteger型に決まらずObject型としてNothingが代入されて n=Nothing となるようです。ちなみにどちらも定数が指定されているのでコンパイルすると条件判定はなくなり、それぞれ n=0・n=Nothingと直接指定したのと同じことになります。
3は、If演算子にふたつの引数を指定した場合です。ひとつめの引数のnにはNothingが入っているので、ふたつめの引数のNothingがnに代入されることになります。結果はn=Nothingのようですね。ふたつ引数を指定するIf演算子は、If演算子の第1引数を省略したと考えます。また第2引数にはnull許容値型が求められるので、返る値がこの場合はInteger?型になり、きちんとNothingが代入されたわけですね。
上の例ではn(Integer?)に代入しているのでわかりませんが、次のよう型推定してやるとエディタ上でどのような型になっているかわかります。
VBでは新しい(?)話題ですが、この関連する話題はとっく中さんがエントリされてました(Nullableを含めた3項演算子)。2006年4月! さらに青柳さんのBlogには2005年8月にちらっと出ています(Nullable Boxing その2)。
そして今日このエントリのきっかけになった出来事。
この場合、c Is NothingはFalseだよん。