«Преобразование из типа« DBNull »в тип« Boolean »недопустимо», после проверки, что это не DBNull - PullRequest
3 голосов
/ 18 января 2012

В моем веб-приложении ASP.Net я получаю эту ошибку:

Преобразование из типа '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.

Ошибка не возникает, когда Item равен не DBNull, поэтому я не понимаю, почему это происходит

1 Ответ

10 голосов
/ 18 января 2012

При использовании IIf все аргументы оцениваются независимо от того, оценивается ли условие как истинное или ложное.В вашем случае функция вернет false, если Item равен null или DBNull , но 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 всегда оценивает все три своихаргументы, тогда как оператор If, имеющий три аргумента, оценивает только два из них.

...