Vb.net Boolean и ничего
Определим эту функцию:
Public Function Test(ByVal value As Boolean)
Return "blabla" + If(value = Nothing, "", If(value, "1", "0"))
End Function
Я хочу, чтобы он сделал следующее:
Test(True) -> "blabla1"
, Test(False) -> "blabla0"
, Test(Nothing) -> "blabla"
.
Проблема в том, что Test(Nothing)
возвращает "blabla0".
Ответы
Ответ 1
Значение A Boolean
никогда не может быть null
(Nothing
), возможны значения True
и False
. Вам нужно значение с нулевым значением, Boolean?
, чтобы оно могло быть нулевым.
Используйте свойства HasValue
и Value
значения nullable, чтобы проверить, есть ли значение, и получите значение:
Public Function Test(ByVal value As Boolean?)
Return "blabla" + If(Not value.HasValue, "", If(value.Value, "1", "0"))
End Function
Ответ 2
Boolean
- тип значения, а не ссылочный тип. Следовательно, значение переменной Boolean
никогда не может быть Nothing
. Если сравнить Boolean
с Nothing
, VB.NET сначала преобразует Nothing
в значение по умолчанию для Boolean
, которое равно False
, а затем сравнивает его с этим. Поэтому тестирование, чтобы увидеть, является ли переменная Boolean
Is Nothing
фактически такой же, как и тестирование, чтобы убедиться, что она равна False
. Если вам нужен Boolean
, который можно установить на Nothing
, вам нужно сделать его Nullable(Of Boolean)
. Однако для этого есть ярлык. Чтобы сделать тип значения нулевым, вы можете просто добавить знак вопроса после типа, например:
Public Function Test(ByVal value As Boolean?)
Return "blabla" + If(value.HasValue, If(value.Value, "1", "0"), "")
End Function
Как вы заметили, даже если переменная является обнуляемой, вы по-прежнему не проверяете, является ли она нулевой, сравнивая ее с Nothing
. Это может показаться неожиданностью, но Nullable(Of T)
на самом деле является типом значения. Поэтому, вместо того, чтобы тестировать, если он Nothing
, вы должны использовать свойство HasValue
, как я продемонстрировал в этом примере.
Ответ 3
При тестировании на Nothing вам нужно использовать ключевое слово Is, но вы не сможете передать свое значение как логическое, поскольку оно работает только с ссылочными типами.
If( value Is Nothing, "", If( value, "1", "0" ) )
Также стоит отметить, что Nothing по умолчанию не имеет значения по умолчанию, если оно не является ссылочным типом.
Вы можете изменить свою подпись, чтобы ожидать Object, а не Boolean, если вы хотите это сделать.