VB.NET 可空类型

3

我在VB.net中使用可空类型时遇到了意外的效果。所涉及的对象有一个已定义的属性:

Public Property Value As Int32?

当我尝试使用 IIf 合并值时,会出现空异常。

cmd.Parameters.AddWithValue("@HOValue", IIf(headOffice.Value.HasValue, headOffice.Value .Value, DBNull.Value))

在C#中,我知道nullables没有隐式转换,因此无法使用??,但为什么VB.NET的IIf的第一部分会被评估?

4
请参考:https://dev59.com/qXRB5IYBdhLWcg3wl4Oc - Marc Gravell
2个回答

9

原因是 Iif 是一个函数,所以无论条件是否成立,都会评估true值和false值。

相反,请使用If,如下:

 cmd.Parameters.AddWithValue("@HOValue", If(headOffice.Value.HasValue, headOffice.Value.Value, DBNull.Value)) ' Assuming you've already checked that headOffice.Value IsNot Nothing

3

Iff是一个函数,即在执行之前会先评估其参数。当headOffice.Value为空时,在此处无法评估headOffice.Value.Value


这很有道理,更加加深了我对VB的憎恨。不过还是谢谢你提供的信息。 - Echilon
2
@Echilon,还有一个三部分的If可以在不痛苦的情况下实现你想要的功能。 - Marc Gravell
1
在VB 2008及更高版本中,if语句可以像您所需的三元运算符一样工作。如果(headOffice.Value.HasValue,headOffice.Value.Value,DBNull.Value)http://blogs.msdn.com/b/vbteam/archive/2008/03/11/if-operator-a-new-and-improved-iif-sophia-salim.aspx - CheckRaise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接