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

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

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

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


person Jim Counts    schedule 23.02.2009    source источник
comment
Тернарный оператор - это любой оператор, который принимает три операнда, так же как бинарный оператор принимает два, а унарный оператор - один. Оператор?: - это конкретный пример оператора ternay, а не его определение.   -  person Zooba    schedule 23.02.2009


Ответы (4)


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

Пример:

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

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

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

Пример:

Dim foo as String = IIf(bar = buz, cat, dog)
person Beep beep    schedule 23.02.2009
comment
До 2008 года это был IIf, который работал почти так же, как оператор If, описанный в вашей ссылке. - person Zooba; 23.02.2009
comment
... с той важной разницей, что Iif (), будучи функцией, всегда оценивает как следствие, так и альтернативу, тогда как new If оценивает только одно из них. - person Greg Hewgill; 23.02.2009
comment
что это значит? Если (условие, истинная часть, ложная часть). могу я обрядиться? - person kbvishnu; 20.01.2012
comment
Я большой специалист по C, но считаю этот синтаксис чище, чем традиционный тернарный оператор. - person crush; 10.02.2015
comment
Еще одно важное отличие: Iif всегда возвращает объект типа Object, тогда как If(bool, obj, obj) допускает проверку типов с помощью параметра strict 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, потому что он будет проверять возвращаемый тип.) - person Joseph Nields; 21.04.2015

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

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

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

person Kris Erickson    schedule 23.02.2009
comment
Однако Iif близок только к тернарному оператору - это означает, что вы не можете использовать его во всех условиях, в которых вы использовали бы If Then Else (или тернарный оператор). Например, Value = Iif (1 = 1, 0, 1/0) взорвется, а Value = If (1 = 1, 0, 1/0) не ... - person Beep beep; 23.02.2009
comment
VB не поддерживает оценку короткого замыкания (за исключением оператора AndAlso), поэтому программисты VB не ожидают, что они смогут безопасно оценить половину операции. Но, принимая во внимание, iif также является хакерской функцией, которая была добавлена ​​для обратной совместимости, иначе это был бы настоящий оператор. - person Kris Erickson; 23.02.2009
comment
Приятно распределить по категориям всех программистов VB ;-) И есть также IsNot и OrElse для быстрого доступа, так что VB действительно поддерживает оценку короткого замыкания. - person HardCode; 23.02.2009
comment
Iif - это обычный вызов метода, который оценивает все параметры. Это не троично. См. dotnetslackers.com/VB_NET/. - person LosManos; 18.12.2012
comment
Как я уже сказал, это НЕ настоящий оператор, и vb6 не поддерживает оценку короткого замыкания, поэтому в любом случае он всегда оценивает все операции в оперативном режиме. - person Kris Erickson; 18.12.2012
comment
Метод IIf является частью пространства имен Microsoft.VisualBasic, которое несовместимо с другими языками .NET. Поэтому лучше использовать метод If (). - person Aave; 17.10.2018
comment
@Aave: пространство имен, безусловно, совместимо с другими языками, эта конкретная функция всегда была бессмысленной, но это не значит, что все в пространстве имен бесполезно или может использоваться только с vb. - person jmoreno; 17.02.2019

Если () - ближайший эквивалент, но остерегайтесь неявных преобразований, происходящих, если вы отключили Option Strict

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

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

Придаст foo значение 0!

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

person unnknown    schedule 16.08.2012
comment
Для полноты картины лучше всего написать это выражение Dim foo As Integer? = If( someTrueExpression, New Integer?, 2). - person Mark Hurd; 04.02.2015
comment
Обратите внимание, что это также происходит с Option Strict On. Причина в том, что Nothing в VB.NET эквивалентен default(T) в C #, а не null. - person Heinzi; 10.12.2015
comment
А для всех, кого озадачивает Integer?, это означает, что он допускает значение NULL - см. stackoverflow.com/questions/3628757/make-an- целое-ноль - person AjV Jsy; 17.06.2016
comment
Для тех, кто застрял на неявном преобразовании для типов, допускающих значение NULL, см. этот ответ о том, почему и этот ответ для обходного пути, который приводит аргумент перед возвратом (CType(Nothing, DateTime?). - person KyleMit; 17.01.2017

Для записи разница между If и IIf заключается в следующем:

IIf (условие, истинная часть, ложная часть):

  • Это старая функция VB6 / VBA
  • Функция всегда возвращает тип объекта, поэтому, если вы хотите использовать методы или свойства выбранного объекта, вам необходимо повторно преобразовать его с помощью DirectCast, CType или Convert. * Functions к исходному типу.
  • Из-за этого, если истинная часть и ложная часть имеют разные типы, это не имеет значения, в любом случае результатом будет просто объект.

Если (условие, истинная часть, ложная часть):

  • Это новая функция VB.NET
  • Тип результата - это тип выбранной детали, истинная деталь или ложная деталь.
  • Это не работает, если включен строгий режим и две части имеют разные типы. В строгом режиме они должны быть одного типа, иначе вы получите исключение.
  • Если вам действительно нужно иметь две части разных типов, отключите строгий режим (или используйте IIf)
  • Я пока не пробовал, допускает ли строгий режим объекты разного типа, но унаследованные от одной базы или реализующие один и тот же интерфейс. Документация Microsoft не совсем полезна по этой проблеме. Может быть, кто-нибудь здесь это знает.
person Aranxo    schedule 05.12.2020