vb.net – If()语句的奇怪行为

今天我偶然发现了VB.net If()语句的奇怪行为.也许你可以解释为什么它像它一样工作,或者你可以确认它是一个bug.

所以,我有一个带有“TestTable”表的sql数据库,其中一个int列“NullableColumn”可以包含NULL.我想宣读本专栏的内容.

所以我声明了一个Nullable(Of Integer)类型的变量,为“SELECT NullableColumn FROM TestTable”打开一个sqlClient.sqlDataReader,并使用以下代码获取该列的内容

Dim content as Nullable(Of Integer)

...

Using reader as sqlClient.sqlDataReader = ...
  content = If(reader.Isdbnull(reader.Getordinal("NullableColumn")),nothing,reader.GetInt32(reader.Getordinal("NullableColumn")))
End Using

但之后我的变量内容的值为0,而不是我所期望的nothing.

调试时一切看起来都不错,所以

> reader.Getordinal(“NullableColumn”)提供此列的正确序号位置(为0)
> reader.Isdbnull(0)和reader.Isdbnull(reader.Getordinal(“NullableColumn”))传递True,因为此列的内容确实为NULL
>如果(1 = 2,“Not nothing”)提供字符串“Not nothing
>如果(1 = 1,“Not nothing”)提供nothing
> reader.GetInt32(reader.Getordinal(“NullableColumn”))抛出错误,因为NULL无法转换为Integer

那么,为什么我的变量的值为0?

解决方法

在VB中,nothing与null不同. If运算符必须根据传递给它的参数确定其结果的类型.当然,没有任何类型,因此If运算符可以在代码中返回的唯一类型是Int32.如果Isdbnull方法返回true,则If运算符返回nothing强制转换为Int32.在VB中,nothing返回类型的认值.对于Int32,认值为0.

从MSDN上的nothing关键字:

nothing represents the default value of a data type. The default value depends 
on whether the variable is of a value type or of a reference type.

For non-nullable value types,nothing in Visual Basic differs from null in C#. 
In Visual Basic,if you set a variable of a non-nullable value type to nothing,the variable is set to the default value for its declared type. In C#,if you 
assign a variable of a non-nullable value type to null,a compile-time error 
occurs.

我认为只是一个普通的If会效果最好:

If Not reader.Isdbnull(reader.Getordinal("NullableColumn")) Then
    content = reader.GetInt32(reader.Getordinal("NullableColumn"))
End If

或者保持更短

If Not reader.Isdbnull(reader.Getordinal("NullableColumn")) Then content = reader.GetInt32(reader.Getordinal("NullableColumn"))

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...