2

我正在尝试使用以下代码检查 aDBNull并将变量设置为空,如果不是,则设置为短。问题是它未能将变量设置为Nothing并将其设置为 a 0。有人知道为什么吗?

variable = If(currentRow.Item("variable") Is DBNull.Value,
    Nothing, CShort(currentRow.Item("variable")))
4

1 回答 1

5

如果variable声明As Short?了,则代码会稍作调整:您需要If先将任一操作数转换为目标类型:

variable = If(condition, CType(Nothing, Short?), CShort(…))

(您也可以改为使用第三个操作数,或两者兼而有之。)

由于If推导类型的方式,这种转换是必要的:如果两个结果类型不匹配,则推导出一个公共类型,它是最接近的父类型,即两者都继承自的类型。但是,有了Nothing,新规则开始发挥作用,因为就 VB 而言,Nothing它已经是一个有效Short的 - 默认初始化的规则(请参阅下面的旧答案以获得解释)。所以VB不尝试任何类型强制,它只是Short用作返回值。


下面的旧答案,假设 OP 已声明variable As Short

您不能将值类型设置为Nothing。如果您分配Nothing给一个值类型,那么它将被设置为其类型的默认值——即0for Short

您可以轻松地对此进行测试:

Dim s as Short = Nothing
Console.WriteLine(s)

将值类型设置Nothing为与调用其默认构造函数 ( New Short()) 或声明该类型的新变量而不对其进行初始化相同。C# 中的相应操作是赋值default(T)( short s = default(short))。

如果要表示null值类型,则必须使用可为的类型

Dim s as Short? = Nothing

Nows是类型Nullable<Short>(Short?是它的快捷方式) 并且可以分配一个适当的Nothing.

于 2012-11-08T20:14:07.450 回答