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

446

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

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

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

Джим считает
источник
13
Тернарный оператор - это любой оператор, который принимает три операнда, так же, как бинарный оператор принимает два, а унарный оператор принимает один. Оператор?: Является конкретным примером оператора тернея, а не определения.
Zooba

Ответы:

597

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

Пример:

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

[РЕДАКТИРОВАТЬ]

До 2008 года это было IIf, которое работало почти идентичноIf оператору, описанному выше.

Пример:

Dim foo as String = IIf(bar = buz, cat, dog)
Beep Beep
источник
15
До 2008 года это был IIf, который работал почти так же, как оператор If, описанный в вашей ссылке.
Zooba
128
... с тем важным отличием, что Iif (), будучи функцией, всегда оценивает как последующее, так и альтернативное, тогда как новое If только оценивает одно из них.
Грег Хьюгилл
6
что это значит? If (условие, истинная часть, ложная часть). могу я обрядить?
kbvishnu
10
Я большой парень C, но я нахожу этот синтаксис чище, чем традиционный троичный оператор.
раздавить
11
Еще одно важное различие: Iifвсегда возвращает объект типа Object, тогда как If(bool, obj, obj)допускает проверку типов со строгим параметром on. ( Dim var As Integer = Iif(true, 1, 2)не будет компилироваться с опцией strict on, потому что вы могли бы так же легко писать Dim var As Integer = Iif(true, new Object(), new Object()). Вы можете писать Dim var As Integer = If(true, 1, 2)с опцией strict on, потому что она проверит возвращаемый тип.)
Джозеф Нилдс
78

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

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

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

Крис Эриксон
источник
31
Хотя Iif близок только к троичному оператору - это означает, что вы не можете использовать его в любых условиях, которые вы бы использовали If Then Else (или троичный оператор). Например, значение = Iif (1 = 1, 0, 1/0) может взорваться, но значение = если (1 = 1, 0, 1/0) не будет ...
Звуковой сигнал
4
VB не поддерживает оценку короткого замыкания (за исключением оператора AndAlso), поэтому программисты VB на самом деле не ожидают, что они могут безопасно оценить половину операции. Но, если принять во внимание, также, если iif является хакерской функцией, которая была введена для обратной совместимости, иначе это был бы реальный оператор.
Крис Эриксон
39
Приятно классифицировать всех программистов VB ;-) И есть также ярлыки IsNot и OrElse, так что VB действительно поддерживает оценку короткого замыкания.
HardCode
2
Iif является обычным вызовом метода и оценивает все параметры. Это не троичный. Se dotnetslackers.com/VB_NET/…
LosManos
3
Как я уже говорил, это НЕ истинный оператор, и vb6 не поддерживает оценку короткого замыкания, поэтому он всегда оценивает все операции на линии в любом случае.
Крис Эриксон
23

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

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

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

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

Я думаю '?' операторный эквивалент в C # вместо сбоя компиляции

unnknown
источник
8
Просто для полноты, лучший способ написать это выражение Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Марк Херд
9
Обратите внимание, что это также происходит с Option Strict On. Причина в том, что Nothingв VB.NET эквивалентно C #, default(T)а не null.
Хайнци
1
И для тех , кто озадачен Integer?это означает , что это обнуляемый - см stackoverflow.com/questions/3628757/make-an-integer-null
AJV JSY
1
Для любого, кто застрял в неявном преобразовании для обнуляемых типов - посмотрите этот ответ о том, почему и этот ответ для обходного пути, которое приводит аргумент перед возвращением ( CType(Nothing, DateTime?).
KyleMit