Есть ли в 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)

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 # вместо сбоя компиляции


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.