我正在尝试使用以下代码检查a DBNull,如果是,则将变量设置为空,如果不是则为短.问题是它未能将变量设置为Nothing并将其设置为a 0.谁知道为什么?
variable = If(currentRow.Item("variable") Is DBNull.Value,
Nothing, CShort(currentRow.Item("variable")))
Run Code Online (Sandbox Code Playgroud)
如果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一个值类型,那么它将被设置为其类型的默认值 - 这是0为Short.
您可以轻松测试:
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.
| 归档时间: |
|
| 查看次数: |
2575 次 |
| 最近记录: |