我正在尝试使用以下代码检查 aDBNull
并将变量设置为空,如果不是,则设置为短。问题是它未能将变量设置为Nothing
并将其设置为 a 0
。有人知道为什么吗?
variable = If(currentRow.Item("variable") Is DBNull.Value,
Nothing, CShort(currentRow.Item("variable")))
我正在尝试使用以下代码检查 aDBNull
并将变量设置为空,如果不是,则设置为短。问题是它未能将变量设置为Nothing
并将其设置为 a 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
推导类型的方式,这种转换是必要的:如果两个结果类型不匹配,则推导出一个公共类型,它是最接近的父类型,即两者都继承自的类型。但是,有了Nothing
,新规则开始发挥作用,因为就 VB 而言,Nothing
它已经是一个有效Short
的 - 默认初始化的规则(请参阅下面的旧答案以获得解释)。所以VB不尝试任何类型强制,它只是Short
用作返回值。
下面的旧答案,假设 OP 已声明variable As Short
:
您不能将值类型设置为Nothing
。如果您分配Nothing
给一个值类型,那么它将被设置为其类型的默认值——即0
for Short
。
您可以轻松地对此进行测试:
Dim s as Short = Nothing
Console.WriteLine(s)
将值类型设置Nothing
为与调用其默认构造函数 ( New Short()
) 或声明该类型的新变量而不对其进行初始化相同。C# 中的相应操作是赋值default(T)
( short s = default(short)
)。
如果要表示null
值类型,则必须使用可为空的类型:
Dim s as Short? = Nothing
Nows
是类型Nullable<Short>
(Short?
是它的快捷方式) 并且可以分配一个适当的Nothing
.