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, если вы хотите это сделать.