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.