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

Tom*_*cat 2 vb.net

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

variable = If(currentRow.Item("variable") Is DBNull.Value,
    Nothing, CShort(currentRow.Item("variable")))
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 5

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

variable = If(condition, CType(Nothing, Short?), CShort(…))
Run Code Online (Sandbox Code Playgroud)

(您也可以转换第三个操作数,或两者都.)

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


以下老答案,假设OP宣布variable As Short:

您无法将值类型设置为Nothing.如果您指定Nothing一个值类型,那么它将被设置为其类型的默认值 - 这是0Short.

您可以轻松测试:

Dim s as Short = Nothing
Console.WriteLine(s)
Run Code Online (Sandbox Code Playgroud)

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

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

Dim s as Short? = Nothing
Run Code Online (Sandbox Code Playgroud)

现在s是类型Nullable<Short>(Short?是它的快捷方式),可以分配一个正确的Nothing.