我找不到一个明确的答案。自从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中,您可以这样做:
在.NET 2.0中引入了System.Nullable,并且作为一种通用类型对VB可用。尽管无法使用nullable语法,但在VS 2005中,您仍然可以使用它。
Dim x as Nullable(of Integer)
我不确定在VB 2005中是否适用于可空类型的null等效和装箱,但我认为答案是肯定的,因为.Net团队对2.0 CLR进行了更改以实现可空类型的装箱。我想象VB会利用这一点。
在2008年,您显然可以只执行:
Dim x as Integer?
这段代码在VB 2005 (dotnet 2.0)中可以运行,但是它的外观不太美观。
你不能像使用普通变量一样使用它,我原以为它可以像Object类型一样工作,但实际上并不能。
与其这样写:
dim oInt as object
dim i as integer
if oInt is nothing then
msgbox("int is null")
else
i = cint(oInt)
end if
you have this.
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
这里的问题在于,如果您的变量为空并且不小心调用了 Value 属性,它会抛出一个未处理的异常。
例如,我最喜欢的一个就是这个。
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))
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)
我不知道具体历史,但是这确实是VS 2008的一个增强功能。