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エディタが事前コンパイル時にエラーをだしてくれているようですね。