我正在尝试使用以下代码检查DBNull
并将变量设置为空(如果是),如果不是则设置为短。问题是它未能将变量设置为Nothing
并将其设置为0
。有谁知道为什么?
variable = If(currentRow.Item("variable") Is DBNull.Value,
Nothing, CShort(currentRow.Item("variable")))
答案 0 :(得分: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
分配给值类型,则会将其设置为其类型的默认值 - 0
为Short
。
您可以轻松测试:
Dim s as Short = Nothing
Console.WriteLine(s)
将值类型设置为Nothing
与调用其默认构造函数(New Short()
)或声明该类型的新变量而不进行初始化相同。 C#中的相应操作是分配default(T)
(short s = default(short)
)。
如果您想表示null
值类型,则必须使用nullable types:
Dim s as Short? = Nothing
现在s
的类型为Nullable<Short>
(Short?
是其中的一个快捷方式),可以为其分配一个合适的Nothing
。