null 許容型 は VB 2005 になってから扱えるようになりました。しかし、宣言をするのに Nullable(Of T) と書かなければいけなかったり、演算子が使えなかったりと、少々不便なところもありました。

VB 2008 の null 許容型の新要素

 それが VB 2008 になって解消されました。

 宣言をする時は型の後ろに疑問符を付けることで、その型の null 許容型として宣言することができるようになりました。この他にも全部で 3 パターンの宣言方法があります。

null 許容型の宣言方法
Dim value1 As Integer?
Dim value2? As Integer
Dim value3 As Nullable(Of Integer)

 また null 許容型に演算子がサポートされました。これにより次のようなコードを書けるようになりました。

null 許容型の宣言方法
Dim value1 As Integer? = 1
value1 = value1 + 2
Console.WriteLine("value1 = {0}", value1) ' value1 = 3

 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) ' value1.HasValue = False

If value1 Is Nothing Then
    Console.WriteLine("value1 = Nothing")
Else
    Console.WriteLine("value1 = {0}", value1)
End If
' value1 = Nothing

 次に null 許容型ではなく、通常の Nothing との演算では Nothing は 0(型の既定値)として扱われています。

Dim value1 As Integer
value1 = Nothing + 2 ' 0 + 2
Console.WriteLine("value1 = {0}", value1) ' value1 = 2

 では次のコードではどのような結果になるでしょうか?

結果はどうなるでしょうか?
Dim value1 As Integer?
Dim value2 As Integer?
value1 = (value2 + 1) + 2
Console.WriteLine("value1 = {0}", value1) ' value1 = ?

 なんとなく value1 は 2 になりそうな気がしますが、正解は「' value1 = 」つまり value1 は Nothing になります。

 これは、まず (value2 + 1) の部分ですが value2 が Nothing のため結果は Nothing になります。Nothing は Nothing でも Integer? 型の Nothing になります。そのため次のように解釈することが出来ます。

value1 = New Integer? + 2

 見てのとおり null 許容型の Nothing と演算しているため、この結果も Nothing になるということです。