決定的な答えは見つかりません。C# 2.0 以降、宣言できるようになりました
int? i = 125;
の省略形として
Nullable<int> i = Nullable<int>(123);
VB.NET ではこのショートカットが許可されていないことをどこかで読んだことを思い出します。しかし、見よ、今日VS 2008で試してみたところ、うまくいきました。
.NET 2.0以降このようになっているのか、それとも後で追加されたのか、誰か知っていますか?
System.Nullable は .Net 2.0 で導入され、ジェネリック型としてVB で使用できます。nullable 構文を使用することはできません。したがって、VS 2005 では次のことができます。
Dim x as Nullable(of Integer)
VB 2005 で null 等価性とボクシングが nullable に対して機能するかどうかはわかりませんが、.Net チームが 2.0 CLR に変更を加えて nullable を使用したボクシングを実現したため、答えはイエスであると思われます。VBがこれを活用していると思います。
2008年には、明らかに次のことができます:
Dim x as Integer?
VB 2005 (dotnet 2.0) で動作しますが、見苦しいです。
通常の変数のように使用することはできません。オブジェクト型のように機能する可能性があると思いましたが、そうではありません。
これではなく:
dim oInt as object
dim i as integer
if oInt is nothing then
msgbox("int is null")
else
i = cint(oInt)
end if
あなたはこれを持っています。
Dim oInt as nullable(of integer)
dim i as integer
if oInt.HasValue = false then
msgbox("int is null")
else
i = oInt.Value
end if
ここでの問題は、変数が null のときに Value プロパティを呼び出すと、処理されない例外が発生することです。
たとえば、私のお気に入りはこれです。
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))
Supposed Nullable 値が null の場合、実行時エラーが発生します!!!
したがって、ここにnullable(整数の)とオブジェクトコードがあります
nullable(整数の)
if oInt.HasValue then
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt.Value)
else
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, dbnull.value)
end if
物体
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt)
IIRC、null許容型は、非常に遅い段階で.NET2.0に導入されました。C#コンパイラチームは、VB.NETチームよりも多くの言語サポートを詰め込むことができました。VB.NETチームは多かれ少なかれVS2008に追いついた。そのため、たとえば、==演算子を使用してC#2.0ではnullableを比較できますが、VB.NETではNullable.Equals()メソッドに我慢する必要がありました。Grrr。
歴史はわかりませんが、VS 2008 の機能強化でした。