NullableとNothing

 .NET 2.0になって、Nullableが使えるようになりました。これはプリミティブ型にNullを入れられるジェネリックで、VB.NETでいえば、Nothingを入れることができるようになるようです。使い方は簡単、

Dim num as Nullable(of Long) = 2 

のようにすればいいみたいですね。これでnum = Nothingが使えるようになりました。Boxingの魔法によりこのnumはlong型(プリミティブ)にそのまま代入することもできます。

Dim numLong as Long = num 

 しかし、困ったことにIs演算子が使えないため、条件分岐のときなどに普通のクラスと同じようには使えないのです。普通のオブジェクトと同じように

If num Is Nothing Then return 

とでも書こうものなら

'Is' には参照型を持つオペランドが必要ですが、このオペランドの値型は 'System.Nullable(Of Long)' です。

 などと怒られてしまいます。ここはisを使わずにHasValueというプロパティで、Nullableが値を持っているかどうかを判定することになっています。つまり

If Not num.HasValue Then return

 で期待の動作をするようです。ちょっとめんどうですね。

 さらに、VB.NETではメソッドシグニチャにOptionalという機能があります。

Public Sub method(Optional ByVal hoge As String = "default")

 と書くと、method()を呼ぶときhogeをセットしなくても、デフォルト値で呼び出してくれるというものです。ここでNullableを使いたいと思い、次のように書きました。

 Public Sub method2(Optional ByVal num As Nullable(Of Long) = Nothing)

 ところがこれが、ダメなのです。

省略可能なパラメータに Structure 型を指定することはできません。

 と怒られてしまいます。num = NothingがOKなのにどうして初期値は許されないのでしょう。Optionalはメソッドのオーバーロードが簡単にできてしまって、これが良い設計とは限らないとは思いますが、そういう機能が使える以上、ここも使いたいなぁ。