我正在尝试使用以下代码来检查 DBNull
并将变量设置为空(如果是),或者将变量设置为短(如果不是)。问题是它无法将变量设置为 Nothing
,而是将其设置为 0
。有人知道为什么吗?
variable = If(currentRow.Item("variable") Is DBNull.Value,
Nothing, CShort(currentRow.Item("variable")))
最佳答案
如果variable
已声明As Short?
然后代码稍加调整即可工作:您需要强制转换 If
的任一操作数首先到目标类型:
variable = If(condition, CType(Nothing, Short?), CShort(…))
(您也可以转换第三个操作数,或两者都转换。)
此转换是必要的,因为If
推导类型:如果两个结果类型不匹配,则推导出一个公共(public)类型,它是最接近的父类型,即两者都继承的类型。然而,与 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
.
关于vb.net - 在内联 if 语句中将变量设置为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13297002/