null 許容型 は VB 2005 になってから扱えるようになりました。しかし、宣言をするのに Nullable(Of T) と書かなければいけなかったり、演算子が使えなかったりと、少々不便なところもありました。
VB 2008 の null 許容型の新要素
それが VB 2008 になって解消されました。
宣言をする時は型の後ろに疑問符を付けることで、その型の null 許容型として宣言することができるようになりました。この他にも全部で 3 パターンの宣言方法があります。
Dim value1 As Integer?
Dim value2? As Integer
Dim value3 As Nullable(Of Integer)
また null 許容型に演算子がサポートされました。これにより次のようなコードを書けるようになりました。
Dim value1 As Integer? = 1
value1 = value1 + 2
Console.WriteLine("value1 = {0}", value1)
VB 2005 であれば Nullable.Value プロパティから値を取り出さなければいけなかったため、コードが簡素化されるようになりました。
null 許容型の演算
この null 許容型の演算でおもしろいのが Nothing の時(Nullable.HasValue プロパティが False)です。
まず null 許容型が Nothing の時の演算結果は Nothing になります。
Dim value1 As Integer?
value1 = value1 + 2
Console.WriteLine("value1.HasValue = {0}", value1.HasValue)
If value1 Is Nothing Then
Console.WriteLine("value1 = Nothing")
Else
Console.WriteLine("value1 = {0}", value1)
End If
次に null 許容型ではなく、通常の Nothing との演算では Nothing は 0(型の既定値)として扱われています。
Dim value1 As Integer
value1 = Nothing + 2
Console.WriteLine("value1 = {0}", value1)
では次のコードではどのような結果になるでしょうか?
Dim value1 As Integer?
Dim value2 As Integer?
value1 = (value2 + 1) + 2
Console.WriteLine("value1 = {0}", value1)
なんとなく value1 は 2 になりそうな気がしますが、正解は「' value1 = 」つまり value1 は Nothing になります。
これは、まず (value2 + 1) の部分ですが value2 が Nothing のため結果は Nothing になります。Nothing は Nothing でも Integer? 型の Nothing になります。そのため次のように解釈することが出来ます。
value1 = New Integer? + 2
見てのとおり null 許容型の Nothing と演算しているため、この結果も Nothing になるということです。