在内联if语句中将变量设置为null值

时间:2012-11-08 20:12:32

标签: vb.net

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

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

1 个答案:

答案 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分配给值类型,则会将其设置为其类型的默认值 - 0Short

您可以轻松测试:

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