gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:29:04 24 4
gpt4 key购买 nike

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

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

因此,我声明了一个 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

但之后我的变量 content 的值为 0,而不是我预期的 Nothing

调试时一切看起来都正常,所以

  • reader.GetOrdinal("NullableColumn") 提供此列的正确序数位置(即 0)
  • reader.IsDBNull(0)reader.IsDBNull(reader.GetOrdinal("NullableColumn")) 传递 True,因为内容该列的确实为 NULL
  • If(1=2, Nothing, "Not Nothing") 传递字符串“Not Nothing”
  • If(1=1, Nothing, "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"))

关于vb.net - If() 语句的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16077483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com