MSDN > MSDN ライブラリ > テクニカルドキュメント > Visual Studio 2008
 Null 許容型

http://msdn.microsoft.com/ja-jp/library/cc441755.aspx

VB2008でのNull許容型について詳しく書かれています。

で、その中で、
連結演算子 「?」
というものがあります。この扱いには注意が必要です。

VB2008 (.NET Framework 3.5) のサンプルコード

    Dim nullableInteger As Nullable(Of Integer)

 

    nullableInteger = Nothing

    Console.WriteLine("This string is concatenated with a null Integer?" ? nullableInteger)

 

    nullableInteger = 1

    Console.WriteLine("The value of nullable variable is: " ? nullableInteger)

実行結果

This string is concatenated with a null Integer?
The value of nullable variable is: 1

解説(MSDNより)

 連結演算子は、Null 許容型の Null を伝播させない特殊な演算子です。他の参照型と同様、Null 許容変数に値 Nothing が格納されている場合、その値が空の文字列に変換されてから、連結が実行されます。
 

 1つめの、nullableInteger は Nothing ですが、 ””(空の文字列)に変換されている。
 2つめの、nullableInteger は 整数の1 で、文字列と連結して、1という文字列が表示されている。
 (Console.WriteLine がよろしくやってくれるので、Option Strict が On でも結果は同じ)

という状態です。

ここまではいいんですが、ややこしいのは、以下の仕様差です。

・「+」は、Null許容型の連結演算子ではないので、ビルドはとおりますが、実行時にエラーになります。
         InnerException.Message
           "入力文字列の形式が正しくありません。"
         Message:
           String "This string is concatenated with" から型 'Double' への変換は無効です。

・VS2008で、ターゲットフレームワークを .NET Framework 2.0 にしても動作します。
 VB9のコンパイラ VBC(Ver9.0) がうまいことコンパイルしてくれるみたいですね。

・VB2005で同じ文を書くとエラーになります。
 演算子 '&' は、型 'String' および 'System.Nullable(Of Integer)' に対して定義されていません。
 VB2005のVBエディタが事前コンパイル時にエラーをだしてくれているようですね。