нулевой оператор объединения в VB.Net (8) - PullRequest
3 голосов
/ 04 января 2011

Боюсь, что это глупый вопрос, но я должен предположить, что я слишком долго программировал VB.Net и теперь не могу понять, как преобразовать этот C # нуль-оператор объединения в VB .Net:

if( Convert.ToBoolean(ViewState[tp.UniqueID + "_Display"] ?? true) == false ){}

Я знаю функцию IIF , но я не уверен, как использовать ее здесь и дает ли она правильный результат (в IIF оба выражения оцениваются). Пожалуйста, помогите пролить свет на тьму.

РЕДАКТИРОВАТЬ : если вы хотите увидеть источник этого: forums.asp.net Там вы можете увидеть решение, которое генерирует исключение Option Strict On disallows implicit conversions from 'Object' to 'Boolean' компилятора.

Ответы [ 8 ]

5 голосов
/ 04 января 2011

Требуется оператор If (не функция IIF).Его можно использовать как эквивалент условного оператора ?: и оператора объединения нулей ?? из C #, в зависимости от того, передано ли ему 3 аргумента или 2


. Вы действительно хотите что-то вроде:

If Not ViewState[tp.UniqueID + "_Display"] is Nothing AndAlso Not CType(ViewState[tp.UniqueID + "_Display"],Boolean) Then

End If

Что, по крайней мере, все еще вызывает короткое замыкание.

2 голосов
/ 04 января 2011

если вы используете vb 9, вы можете "if" троичный оператор .

1 голос
/ 04 января 2011

Это должно работать:

If (ViewState(tp.UniqueID + "_Display") IsNot Nothing OrElse Convert.ToBoolean(ViewState(tp.UniqueID + "_Display") = false) Then ... End If

Я не использовал оператор IIf для упрощения:)

1 голос
/ 04 января 2011

Давненько, но я думаю, что это то, что вы хотите:

CBool(IIf(IsNothing(ViewState(tp.UniqueID + "_Display")), True, False))

РЕДАКТИРОВАТЬ Тим (OP):

Это то, что на самом деле равняется версии C #

Not CBool(IIf(IsNothing(ViewState(tp.UniqueID + "_Display")), True, ViewState(tp.UniqueID + "_Display")))
0 голосов
/ 23 апреля 2015

Приведенный пример плохой - такой плохой, фактически позорный. У него буквально есть вызов, который оценивает только два разных контекста, чтобы определить, выполняется ли область в квадратных скобках или она пропущена.

Вот логический анализ, чтобы лучше объяснить, что:

  • ViewState [tp.UniqueID + "_Display"] оценивается как:

    • ложь
    • правда
    • ноль или
    • что-то еще

При размещенном источнике, если оценка равна false, операция null-coalesce замыкается накоротко и выдает истинную оценку на «== false». Затем выполняется содержимое фигурных скобок.

Если эта оценка является чем-то еще, тогда оценка обнуляется для 'true' и выдает ложную оценку в == false. Затем содержимое фигурных скобок пропускается.

Итак на самом деле правильный и очень простой способ написать оригинальный источник:

if( Convert.ToBoolean( ViewState[tp.UniqueID + "_Display"] ) == false) {
    // do something
}

Примечательно, что здесь нет операции слияния.

Проблема заключается в том, что этот пример не подходит даже для оправдания использования операции с нулевым слиянием, и это предполагает необходимость когда-либо «преобразовывать» операцию в Visual Basic.

0 голосов
/ 04 января 2011

Используйте функцию String IsNullOrEmpty с объектом request.

Dim display As Boolean = False
If String.IsNullOrEmpty(Request.QueryString("UID")) Then
  display = Convert.ToBoolean(Request.QueryString("UID"))
End If
0 голосов
/ 04 января 2011

Может быть, вы пытаетесь сделать это слишком сложно.Попробуйте это:

If ViewState[tp.UniqueID + "_Display"] = True Then ...

Помните, ViewState возвращает в штучной упаковке object, ничто не мешает вам сравнивать True и False напрямую друг с другом.= True необязательно, если у вас есть Option Strict Off.

В качестве альтернативы

If Object.Equals(ViewState[tp.UniqueID + "_Display"], True) Then
0 голосов
/ 04 января 2011

Используйте IIF для VB.

IIf Справочник по функциям

IIF(
    IIF(Convert.ToBoolean(ViewState[tp.UniqueID + "_Display"] = Nothing, 
          True, 
          ViewState[tp.UniqueID + "_Display"]), 
    Success(), 
    Failure())
...