vb.net - 在内联 if 语句中将变量设置为空值

标签 vb.net

我正在尝试使用以下代码来检查 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/

相关文章:

asp.net-mvc - VB.Net后期绑定(bind)操作不能转换为表达式树

mysql - 如何使用 vb.net 在 MySql 中保存和检索指纹模板?

vb.net - 如何使用HttpWebRequest下载文件

vb.net - 带坐标的 If 语句 (vb)

vb.net - 为什么使用 TryCast 而不是 DirectCast?

.net - 给定一个 hwnd,确定该窗口是否未被其他窗口隐藏(Z-Ordering)

mysql - 使用 BulkCopy 时出错(无法读取结果集)

vb.net - vb.net中的上下文菜单位置

c# - 以编程方式注册 C#/VB.NET COM dll

mysql - 如何检查字符串是否包含日期?