VB.NET Nullable语法的历史

时间:2008-10-21 22:51:42

标签: vb.net syntax nullable

我无法找到明确的答案。从C#2.0开始,你已经能够声明

int? i = 125;

作为

的简写
Nullable<int> i = Nullable<int>(123);

我记得在某处读过VB.NET不允许这个快捷方式。但是很低,不过,我今天在VS 2008中尝试过它并且有效。

有人知道自从.NET 2.0以来是否一直这样,或者这是后来添加的?

4 个答案:

答案 0 :(得分:13)

System.Nullable是在.Net 2.0中引入的,可以作为泛型用于VB 。你只是不能使用可空语法。所以在VS 2005中你可以做到:

Dim x as Nullable(of Integer)

我不知道在VB 2005中null等价和装箱是否适用于nullables,但是我怀疑答案是肯定的,因为.Net团队改变了2.0 CLR来完成装有nullables的拳击。我想象VB会利用这一点。

2008年,您显然可以这样做:

Dim x as Integer?

答案 1 :(得分:3)

它适用于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))

当您的假定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)

答案 2 :(得分:1)

IIRC,可以在.NET 2.0中引入可空类型。 C#编译器团队设法为他们提供了比VB.NET团队更多的语言支持。 VB.NET团队或多或少地陷入了VS2008。这就是为什么你可以使用==运算符来比较C#2.0中的nullables,而在VB.NET中你必须忍受Nullable.Equals()方法。哎呀。

答案 3 :(得分:0)

我不知道历史,但是这是VS 2008增强版。