Есть ли в VB.NET условный троичный оператор?

377

В Perl (и других языках) условный тернарный оператор может быть выражен следующим образом:

my $foo = $bar == $buz ? $cat : $dog;

Есть ли аналогичный оператор в VB.NET?

  • 13
    Тернарный оператор - это любой оператор, который принимает три операнда, так же, как бинарный оператор принимает два, а унарный оператор принимает один. Оператор?: Является конкретным примером оператора тернея, а не определения.
  • 83
    Да, спасибо, но эта информация не помогает.
Показать ещё 1 комментарий
Теги:
operators
equivalent
short-circuiting
conditional-operator

8 ответов

506
Лучший ответ

Зависит от версии. Оператор If в VB.NET 2008 является тройным оператором (а также оператором нулевой коалесценции). Это было только что введено, до 2008 года это было недоступно. Вот еще информация: Visual Basic Если объявление

Пример:

Dim foo as String = If(bar = buz, cat, dog)
  • 13
    До 2008 года это был IIf, который работал почти так же, как оператор If, описанный в вашей ссылке.
  • 115
    ... с тем важным отличием, что Iif (), будучи функцией, всегда оценивает как последующее, так и альтернативное, в то время как новое If только оценивает одно из них.
Показать ещё 4 комментария
71

iif всегда был доступен в VB, даже в VB6.

Dim foo as String = iif(bar = buz, cat, dog)

Это не истинный оператор, как таковой, а функция в пространстве имен Microsoft.VisualBasic.

  • 30
    Хотя Iif близок только к троичному оператору - это означает, что вы не можете использовать его в любых условиях, которые вы бы использовали If Then Else (или троичный оператор). Например, значение = Iif (1 = 1, 0, 1/0) будет взорвано, но значение = если (1 = 1, 0, 1/0) не будет ...
  • 3
    VB не поддерживает оценку короткого замыкания (за исключением оператора AndAlso), поэтому программисты VB не ожидают, что смогут безопасно оценить половину операции. Но, если принять во внимание, также, если iif является хакерской функцией, которая была введена для обратной совместимости, иначе это был бы реальный оператор.
Показать ещё 5 комментариев
19

Если() является ближайшим эквивалентом, но остерегается неявных преобразований, если вы выбрали "Option Strict off"

Например, если вы не будете осторожны, у вас может возникнуть соблазн попробовать что-то вроде:

Dim foo As Integer? = If( someTrueExpression, Nothing, 2)

Дает "foo" значение 0!

Я думаю, что '?' оператор, эквивалентный в С#, вместо этого завершит компиляцию

  • 7
    Просто для полноты, лучший способ написать это выражение - Dim foo As Integer? = If( someTrueExpression, New Integer?, 2) .
  • 8
    Обратите внимание, что это также происходит с Option Strict On . Причина в том, что Nothing в VB.NET не эквивалентно C # по default(T) а не равно null .
Показать ещё 2 комментария
2

Вы можете использовать этот пример:

Dim MyResult As String = If(MyString = MyCondition, "trueValue", "falseValue")
1

Если ([аргумент1,] аргумент2, аргумент3) Когда If вызывается с использованием трех аргументов, первый аргумент должен оценивать значение, которое может быть выбрано как Boolean. Это логическое значение будет определять, какой из двух других аргументов оценивается и возвращается. Следующий список применяется только тогда, когда оператор If вызывается с использованием трех аргументов.

-1

Я не думаю, что это отвечает на исходный вопрос, но это, безусловно, то, что я искал, когда нашел эту страницу!

https://msdn.microsoft.com/en-us/library/z2wkh0tk(v=vs.90).aspx#Anchor_1

-2

VB 2010 и выше также поддерживают это выражение:

тест? expression1: expression2

Пример:

var now = new Date(); var greeting = "Good" + ((now.getHours() > 17)? "Вечер".: "день." );

проверьте msdn документацию здесь: https://msdn.microsoft.com/en-us/library/zakwfxx4(v=vs.100).aspx

-4

Используйте эту строку,

foo=IIf(bar=buz,cat,dog)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню