我找不到明确的答案。从 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 。您只是不能使用可为空的语法。所以在 VS 2005 中你可以这样做:
Dim x as Nullable(of Integer)
我不知道空等价和装箱是否适用于 VB 2005 中的可空值,但我怀疑答案是肯定的,因为 .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
你有这个。
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 时将导致运行时错误!!!
所以这里是可空的(整数)与对象代码
可空(整数)
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,可空类型是在很晚的阶段在 .NET 2.0 中引入的。C# 编译器团队设法为它们提供了比 VB.NET 团队更多的语言支持。VB.NET 团队或多或少地赶上了 VS2008。这就是为什么您可以在 C# 2.0 中使用 == 运算符比较可空值,而在 VB.NET 中您必须忍受 Nullable.Equals() 方法。嗯。
我不知道历史,但是是的,它是 VS 2008 的增强。