"在检查它不是DBNull之后,从类型'DBNull'转换为'Boolean'类型无效"

Dre*_*pin 3 vb.net iif-function ternary-operator

在我的ASP.Net Web应用程序中,我收到此错误:

从类型"DBNull"到"布尔"类型的转换无效.

从这个功能:

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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我明确地检查是否ItemDBNull,如果是,那么我回来了False.

没有错误没有发生时Item没有 DBNull的,所以我不明白为什么会这样.

Den*_*aub 11

使用时IIf,无论条件的计算结果是true还是false,都会对所有参数进行求值.在你的情况下,false如果ItemnullDBNull,函数将返回,但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
Run Code Online (Sandbox Code Playgroud)

摘自MSDN:

一个IIf函数始终计算所有三个它的参数,而一个If有三个参数操作只判断其中的两个.