оператор null coalesce в VB.Net (8)

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

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

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

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

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

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

EDIT by Tim (OP):

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

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

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


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

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

Это, по крайней мере, дает вам короткое замыкание.

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

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

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

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

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

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

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

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

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

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

альтернативно

 If Object.Equals(ViewState[tp.UniqueID + "_Display"], True) Then 

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

 Dim display As Boolean = False If String.IsNullOrEmpty(Request.QueryString("UID")) Then display = Convert.ToBoolean(Request.QueryString("UID")) End If 

Приведенный пример плох – так плохо, что он практически позор. Он буквально имеет вызов, который оценивает только два разных контекста, чтобы выполнить область или скопированную область в квадратных скобках.

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

  • ViewState [tp.UniqueID + “_Display”] будет оценивать:

    • ложный,
    • правда,
    • null или
    • что-то другое

Если опубликованный источник, если оценка ложна, операция с нулевым коалесцентом закорочена и заставляет истинную оценку «== false». Затем выполняется curly-bracket-content.

Если эта оценка – это что-то еще, тогда оценка null-coalesces to «true» и заставляет ложную оценку «== false». Затем содержимое курсива-скобки пропускается.

Так что собственно правильный и очень простой способ написать исходный источник:

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

Примечательно, что это не имеет операции с нулевым объединением.

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