5

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

int? i = 125;

作为简写

Nullable<int> i = Nullable<int>(123);

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

有谁知道自 .NET 2.0 以来是这种方式还是后来添加的?

4

4 回答 4

13

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?
于 2008-10-22T00:51:32.710 回答
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))

当您的 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)
于 2008-11-19T16:12:14.070 回答
1

IIRC,可空类型是在很晚的阶段在 .NET 2.0 中引入的。C# 编译器团队设法为它们提供了比 VB.NET 团队更多的语言支持。VB.NET 团队或多或少地赶上了 VS2008。这就是为什么您可以在 C# 2.0 中使用 == 运算符比较可空值,而在 VB.NET 中您必须忍受 Nullable.Equals() 方法。嗯。

于 2009-06-08T12:09:05.393 回答
0

我不知道历史,但是是的,它是 VS 2008 的增强。

于 2008-10-21T22:54:00.997 回答