Как повлиять на логическое значение результата логического? выражение - PullRequest
0 голосов
/ 17 января 2019

Я хотел бы закодировать в VB эквивалент этого в C #:

bool? a = whatever;
bool b= (a==true);

VB компилятор не принимает это:

Dim a As Boolean?
Dim b As Boolean = (a = True)

Полагаю, в этом контексте он интерпретирует (a = True) как аффект, а я хочу, чтобы это интерпретировалось как выражение. (a == True), очевидно, является синтаксической ошибкой.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Вы также можете использовать CBool

Dim a As Boolean?
Dim b As Boolean = CBool(a = True)
0 голосов
/ 17 января 2019

Вы должны быть осторожны с различиями между 0, Nothing и vbNull. 0 является значением по умолчанию для логического значения. vbNull - это зарезервированное значение Null, которое должно переводиться как 1. Ничто не вызовет исключения практически при любых обстоятельствах.

Dim a As Boolean? = Nothing
Dim b As Boolean? = vbNull
Dim c As Boolean = vbNull
Dim d As Boolean

Print(a = True) 'will throw an Exception
Print(b = True) 'will return True (as vbNull = Int(1))
Print(c = True) 'will return True as the ? is unnecessary on a Boolean as vbNull = Int(1)
Print(d = True) 'will return False as the default value of a Boolean is 0
Print(a.GetValueOrDefault) 'will return False as this handles the Nothing case.

При работе с неназначенными значениями вы должны всегда сначала проверять Nothing (или просто следовать хорошей практике и устанавливать значение перед использованием).

    Dim a As Boolean?
    Dim b As Boolean = IIf(IsNothing(a), False, a)

Это вернет False, если a - Nothing, иначе вернет A.

Только после проверки на Nothing вы можете проверить на vbNull, поскольку Nothing возвращает ошибку для всех значений. Приведенный ниже код вернет значение False, если Nothing, vbNull или другое.

    Dim a As Boolean?
    Dim b As Boolean = IIf(IsNothing(a), False, IIf(a = vbNull, False, a))

Примечание: вы не можете использовать приведенный ниже код, так как тест a = vbNull будет против Ничего, которое вызовет исключение.

Or(IsNothing(a), a = vbNull) 

Я бы также не использовал GetValueOrDefault в любом реальном приложении, поскольку при использовании более сложных типов данных настройки по умолчанию не будут такими простыми, и вы можете получить неожиданные результаты. ИМХО гораздо лучше проверить на IsNothing (или Object = Nothing, Object Is Nothing), чем полагаться на причуды типа данных.

Лучшей практикой будет обеспечение значения a, которое вы можете сделать, используя

    Dim a As Boolean? = New Boolean()
    Dim b As Boolean = a

Причина, по которой я говорю, что это лучшая практика, заключается в том, что она распространяется на все классы, а не только на булевы. Отмечено, что это логично для логических выражений.

Надеюсь, это поможет.

0 голосов
/ 17 января 2019

Вы можете использовать GetValueOrDefault -метод:

Dim a As Boolean?
Dim b As Boolean = a.GetValueOrDefault()
...