VB.NET 可空类型语法的历史

5

我找不到一个明确的答案。自从C# 2.0以来,您就可以声明

int? i = 125;

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

我记得在某个地方读到VB.NET不允许这种快捷方式。但看啊,今天我在VS 2008中尝试了它,它可以工作。

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

4个回答

13

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?

1
空等价和装箱在VB 2005中运作良好。2008年的更改重点是添加“?”语法,并实现操作符提升。需要注意的一件事是,“?”语法的支持没有添加到VS Code Model / Code DOM中,因此任何使用可空类型的设计器生成的代码都将始终使用旧的通用语法。 - Scott Wisniewski

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

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)

2
一个更简单的添加参数的方法是利用“新”“If”运算符:AddParamToSQLCmd(sqlCmd,“@SomeID”,SqlDbType.Int,0,ParameterDirection.Input,If(oInt.HasValue,oInt.Value,DBNull.value))以上代码之所以有效,是因为If是一个短路运算符,而IIf方法调用的两个操作数都会被评估,无论第一个操作数是否为真。 - pb.

1
据我所知,可空类型是在 .NET 2.0 的非常后期引入的。C# 编译器团队为它们提供了比 VB.NET 团队更多的语言支持。VB.NET 团队在 VS2008 中基本上追赶上了。这就是为什么你可以在 C# 2.0 中使用 == 运算符来比较可空类型,而在 VB.NET 中你必须使用 Nullable.Equals() 方法。真让人恼火。

0

我不知道具体历史,但是这确实是VS 2008的一个增强功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接