Esiste un operatore ternario condizionale in VB.NET?


446

In Perl (e in altre lingue) un operatore ternario condizionale può essere espresso in questo modo:

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

Esiste un operatore simile in VB.NET?


13
Un operatore ternario è qualsiasi operatore che accetta tre operandi, proprio come un operatore binario ne prende due e un operatore unario ne prende uno. L'operatore?: È un esempio specifico di un operatore ternay, non la definizione.
Zooba,

Risposte:


597

Dipende dalla versione. L' Ifoperatore in VB.NET 2008 è un operatore ternario (nonché un operatore a coalescenza nulla). Questo è stato appena introdotto, prima del 2008 non era disponibile. Ecco alcune altre informazioni: Visual Basic Se l'annuncio

Esempio:

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

[MODIFICARE]

Prima del 2008 lo era IIf, che funzionava in modo quasi identico con l' Ifoperatore sopra descritto.

Esempio:

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

15
Prima del 2008 era IIf, che funzionava in modo quasi identico all'operatore If descritto nel tuo link.
Zooba,

128
... con l'importante differenza che Iif (), essendo una funzione, ha sempre valutato sia il conseguente sia l'alternativa, mentre il nuovo If ne valuta solo uno.
Greg Hewgill,

6
cosa significa? If (condizione, parte vera, parte falsa). posso rito?
kbvishnu,

10
Sono un ragazzo C enorme, ma trovo questa sintassi più pulita del tradizionale operatore ternario.
schiaccia il

11
Un'altra importante distinzione: Iifrestituisce sempre un oggetto di tipo Object, mentre If(bool, obj, obj)consente il controllo del tipo con l'opzione rigorosa su. ( Dim var As Integer = Iif(true, 1, 2)non verrà compilato con l'opzione rigorosa su perché potresti scrivere altrettanto facilmente Dim var As Integer = Iif(true, new Object(), new Object()). Puoi comunque scrivere Dim var As Integer = If(true, 1, 2)con l'opzione rigorosa su, perché controllerà il tipo restituito.)
Joseph Nields

78

iif è sempre stato disponibile in VB, anche in VB6.

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

Non è un vero operatore, in quanto tale, ma una funzione nello spazio dei nomi Microsoft.VisualBasic.


31
Iif è vicino solo a un operatore ternario, il che significa che non puoi usarlo in tutte le condizioni in cui potresti essere un If Then Else (o un operatore ternario). Ad esempio, Valore = Iif (1 = 1, 0, 1/0) esploderebbe, ma Valore = Se (1 = 1, 0, 1/0) non ...
Bip beep

4
VB non supporta la valutazione del corto circuito (ad eccezione dell'operatore AndAlso), quindi i programmatori VB non si aspettano davvero di poter valutare con sicurezza mezza operazione. Ma punto in questione, anche se è una funzione di hacking che è stata inserita per la compatibilità con le versioni precedenti, altrimenti sarebbe un vero operatore.
Kris Erickson,

39
Bello categorizzare tutti i programmatori VB ;-) E c'è anche IsNot e OrElse per il collegamento, quindi VB supporta davvero la valutazione del corto circuito.
HardCode

2
Iif è una chiamata di metodo regolare e valuta tutti i parametri. Non è ternario. Vedi dotnetslackers.com/VB_NET/…
LosManos il

3
Come ho detto, NON è un vero operatore e vb6 non supporta la valutazione del corto circuito, quindi valuta sempre tutte le operazioni in linea.
Kris Erickson,

23

If () è l'equivalente più vicino ma attenzione fai alle conversioni implicite in corso se hai impostato "Opzione rigorosa"

Ad esempio, se non stai attento potresti essere tentato di provare qualcosa del tipo:

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

Darà "pippo" un valore di 0!

Penso che la '?' l'operatore equivalente in C # fallirebbe invece nella compilazione


8
Solo per completezza, il modo migliore per scrivere quell'espressione è Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Mark Hurd,

9
Si noti che ciò accade anche con Option Strict On. Il motivo è che Nothingin VB.NET è equivalente a C # default(T)piuttosto che a null.
Heinzi,

1
E per chiunque perplesso Integer?significa che è annullabile - vedi stackoverflow.com/questions/3628757/make-an-integer-null
AJV Jsy

1
Per chiunque rimanga bloccato sulla conversione implicita per i tipi nullable - vedi questa risposta sul perché e questa risposta per una soluzione alternativa che lancia l'argomento prima di restituire ( CType(Nothing, DateTime?).
KyleMit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.