Existe um operador ternário condicional no VB.NET?

446

No Perl (e em outros idiomas), um operador ternário condicional pode ser expresso assim:

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

Existe um operador semelhante no VB.NET?

Jim Counts
fonte
13
Um operador ternário é qualquer operador que usa três operandos, assim como um operador binário usa dois e um operador unário usa um. O operador?: É um exemplo específico de operador ternay, não a definição.
Zooba 23/02/09

Respostas:

597

Depende da versão. O Ifoperador no VB.NET 2008 é um operador ternário (assim como um operador de coalescência nula). Isso foi introduzido recentemente, antes de 2008 isso não estava disponível. Aqui estão mais algumas informações: Visual Basic Se anúncio

Exemplo:

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

[EDITAR]

Antes de 2008, foi IIf, que trabalhou quase de forma idêntica ao Ifoperador descrito acima.

Exemplo:

Dim foo as String = IIf(bar = buz, cat, dog)
Bip Bip
fonte
15
Antes de 2008, era o IIf, que funcionava quase de forma idêntica ao operador If descrito no seu link.
Zooba 23/02/09
128
... com a importante diferença de que Iif (), sendo uma função, sempre avaliou tanto a conseqüente quanto a alternativa, enquanto o novo If avalia apenas uma delas.
Greg Hewgill 23/02/09
6
o que isso significa ? Se (condição, parte verdadeira, parte falsa). posso ritar?
kbvishnu
10
Eu sou um cara C enorme, mas acho essa sintaxe mais limpa do que o operador ternário tradicional.
esmagar
11
Outra distinção importante: Iifsempre retorna um objeto do tipo Object, enquanto If(bool, obj, obj)permite a verificação do tipo com a opção strict on. ( Dim var As Integer = Iif(true, 1, 2)Não irá compilar com a opção rigorosa, porque você poderia facilmente escrever Dim var As Integer = Iif(true, new Object(), new Object()), você pode escrever. Dim var As Integer = If(true, 1, 2)Com opção rigoroso sobre embora, porque ele vai verificar o tipo retornado.)
Joseph Nields
78

O iif sempre esteve disponível no VB, mesmo no VB6.

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

Não é um operador verdadeiro, como tal, mas uma função no espaço para nome Microsoft.VisualBasic.

Kris Erickson
fonte
31
No entanto, se o Iif estiver perto de um operador ternário - o que significa que você não pode usá-lo em todas as condições que você faria com um If Then Else (ou operador ternário). Por exemplo, Valor = IIF (1 = 1, 0, 1/0) iria explodir, mas Valor = Se (1 = 1, 0, 1/0) não ...
Beep beep
4
O VB não suporta avaliação de curto-circuito (exceto o operador AndAlso), portanto, os programadores de VB realmente não esperam que possam avaliar com segurança metade de uma operação. Mas, no ponto, também se iif for uma função de hack que foi colocada em compatibilidade com versões anteriores, caso contrário seria um operador real.
Kris Erickson
39
É bom categorizar todos os programadores de VB ;-) E também há IsNot e OrElse para atalho, de modo que o VB realmente suporta a avaliação de curto-circuito.
23909 HardCode
2
Iif é uma chamada de método regular e avalia todos os parâmetros. Não é ternário. Se dotnetslackers.com/VB_NET/…
LosManos
3
Como afirmei, NÃO é um operador verdadeiro e o vb6 não suporta avaliação de curto-circuito, portanto, sempre avalia todas as operações on-line de qualquer maneira.
Kris Erickson
23

Se () é o equivalente mais próximo, mas tenha cuidado com conversões implícitas, se você tiver definido "Opção restrita"

Por exemplo, se você não tomar cuidado, pode ser tentado a tentar algo como:

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

Dará a "foo" o valor 0!

Eu acho que o '?' O operador equivalente em C # falharia na compilação

desconhecido
fonte
8
Apenas para completar, a melhor maneira de escrever essa expressão é Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Mark Hurd
9
Observe que isso também acontece com Option Strict On. O motivo é que Nothingno VB.NET é equivalente a C #, default(T)e não a null.
Heinzi
1
E para qualquer um intrigado com Integer?isso significa que é anulável - ver stackoverflow.com/questions/3628757/make-an-integer-null
AJV JSY
1
Para quem fica preso na conversão implícita para tipos anuláveis ​​- veja esta resposta sobre o porquê e esta resposta para uma solução alternativa que lança o argumento antes de retornar ( CType(Nothing, DateTime?).
precisa saber é o seguinte