我无法找到明确的答案。从C#2.0开始,你已经能够声明
了int? i = 125;
作为
的简写Nullable<int> i = Nullable<int>(123);
我记得在某处读过VB.NET不允许这个快捷方式。但是很低,不过,我今天在VS 2008中尝试过它并且有效。
有人知道自从.NET 2.0以来是否一直这样,或者这是后来添加的?
答案 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增强版。