6

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

ご覧のとおり、 であるかどうかを明示的にチェックしてItemおりDBNull、そうである場合は を返しFalseます。

is notの場合はエラーにならないので、なぜこうなるのかわかりません。Item DBNull

4

1 に答える 1

13

使用するIIfと、条件が true または false に評価されても、すべての引数が評価されます。あなたの場合、 ItemnullまたはDBNullfalseの場合、関数は返されますが、とにかくバックグラウンドでサイレントに実行されるため、例外がスローされます。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

MSDNからの抜粋:

IIf関数は常に 3 つすべての引数を評価しますが、3 つの引数Ifを持つ演算子はそのうちの 2 つだけを評価します。

于 2012-01-18T16:17:04.843 に答える