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

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

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

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

23.02.2009 03:17:30
Тернарный оператор - это любой оператор, который принимает три операнда, так же, как бинарный оператор принимает два, а унарный оператор принимает один. Оператор?: Является конкретным примером оператора тернея, а не определения.
Zooba 23.02.2009 03:36:39
3 ОТВЕТА
РЕШЕНИЕ

Зависит от версии. 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)
590
21.02.2020 21:30:24
До 2008 года это был IIf, который работал почти так же, как оператор If, описанный в вашей ссылке.
Zooba 23.02.2009 04:18:26
... с тем важным отличием, что Iif (), будучи функцией, всегда оценивает как последующее, так и альтернативное, тогда как новое If только оценивает одно из них.
Greg Hewgill 23.02.2009 04:21:59
что это значит? Если (условие, истина-часть, ложь-часть). могу я обрядить?
kbvishnu 20.01.2012 10:21:06
Я большой парень C, но я нахожу этот синтаксис чище, чем традиционный троичный оператор.
crush 10.02.2015 19:39:03
Еще одно важное различие: 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, потому что она проверит возвращаемый тип.)
Joseph Nields 21.04.2015 14:55:55

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

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

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

77
23.02.2009 04:25:19
Хотя Iif только близок к троичному оператору - это означает, что вы не можете использовать его в любых условиях, которые вы бы использовали If Then Else (или троичный оператор). Например, значение = Iif (1 = 1, 0, 1/0) может взорваться, но значение = если (1 = 1, 0, 1/0) не будет ...
Beep beep 23.02.2009 14:57:23
VB не поддерживает оценку короткого замыкания (за исключением оператора AndAlso), поэтому программисты VB не ожидают, что смогут безопасно оценить половину операции. Но, если принять во внимание, также, если iif - это функция взлома, которая была введена для обратной совместимости, иначе это был бы реальный оператор.
Kris Erickson 23.02.2009 15:22:40
Приятно классифицировать всех программистов VB ;-) И есть также ярлыки IsNot и OrElse, поэтому VB действительно поддерживает оценку короткого замыкания.
HardCode 23.02.2009 17:43:43
Iif является обычным вызовом метода и оценивает все параметры. Это не троичный. Se dotnetslackers.com/VB_NET/…
LosManos 18.12.2012 16:10:17
Как я уже говорил, это НЕ истинный оператор, и vb6 не поддерживает оценку короткого замыкания, поэтому он всегда оценивает все операции на линии в любом случае.
Kris Erickson 18.12.2012 19:09:36

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

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

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

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

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

24
16.08.2012 19:55:31
Просто для полноты, лучший способ написать это выражение Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Mark Hurd 4.02.2015 06:15:31
Обратите внимание, что это также происходит с Option Strict On. Причина в том, что Nothingв VB.NET эквивалентно C #, default(T)а не null.
Heinzi 10.12.2015 14:32:24
И для тех , кто озадачен Integer?это означает , что это обнуляемый - см stackoverflow.com/questions/3628757/make-an-integer-null
AjV Jsy 17.06.2016 13:59:00
Для любого, кто застрял в неявном преобразовании для обнуляемых типов - посмотрите этот ответ относительно того, почему и этот ответ для обходного пути, которое приводит аргумент перед возвращением ( CType(Nothing, DateTime?).
KyleMit 17.01.2017 19:31:13