Vb.net &引用;从类型转换为';DBNull';输入';布尔值';“无效”;,在检查它';它不是DBNull

Vb.net &引用;从类型转换为';DBNull';输入';布尔值';“无效”;,在检查它';它不是DBNull,vb.net,ternary-operator,iif-function,Vb.net,Ternary Operator,Iif Function,在我的ASP.Net Web应用程序中,我遇到以下错误: 从类型“DBNull”到类型“Boolean”的转换无效 从该函数: Namespace atc Public Class Nil '... Public Shared Function Bool(ByVal Item As Object) As Boolean Return IIf(Item IsNot Nothing AndAlso Not IsDBNull(Item),

在我的ASP.Net Web应用程序中,我遇到以下错误:

从类型“DBNull”到类型“Boolean”的转换无效

从该函数:

Namespace atc
    Public Class Nil
        '...
        Public Shared Function Bool(ByVal Item As Object) As Boolean
            Return IIf(Item IsNot Nothing AndAlso Not IsDBNull(Item), CBool(Item), False)
        End Function
        '...
    End Class
End Namespace
如您所见,我正在显式检查
是否为
DBNull
,如果是,则返回
False


DBNull
时,会发生错误,因此我不理解为什么会发生这种情况

当使用
IIf
时,所有参数都会得到计算,无论条件的计算结果是真还是假。在您的情况下,如果Item为null或DBNull,函数将返回
false
,但
CBool(Item)
仍将在后台静默执行,因此引发异常

在VB.NET 2008中,添加了
If
关键字以提供真正的三元运算符。将
IIf
函数调用替换为以下内容:

Public Shared Function Bool(ByVal Item As Object) As Boolean
    Return If(Item IsNot Nothing AndAlso Not IsDBNull(Item), CBool(Item), False)
End Function
摘录自:

IIf
函数始终计算其所有三个参数,而 具有三个参数的
If
运算符只计算其中两个参数


哇,iff真的很糟糕。虽然在我看来If也有类似的问题:(