¿Hay un operador ternario condicional en VB.NET?

446

En Perl (y otros idiomas), un operador ternario condicional se puede expresar así:

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

¿Hay un operador similar en VB.NET?

Jim cuenta
fuente
13
Un operador ternario es cualquier operador que toma tres operandos, al igual que un operador binario toma dos y un operador unario toma uno. El operador?: Es un ejemplo específico de un operador ternay, no la definición.
Zooba

Respuestas:

597

Depende de la versión. El Ifoperador en VB.NET 2008 es un operador ternario (así como un operador de fusión nula). Esto se acaba de presentar, antes de 2008 no estaba disponible. Aquí hay más información: Visual Basic si anuncio

Ejemplo:

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

[EDITAR]

Antes de 2008 era IIf, lo que funcionaba casi de manera idéntica al Ifoperador descrito anteriormente.

Ejemplo:

Dim foo as String = IIf(bar = buz, cat, dog)
Bip bip
fuente
15
Antes de 2008 era IIf, que funcionaba casi de manera idéntica al operador If descrito en su enlace.
Zooba
128
... con la importante diferencia de que Iif (), siendo una función, siempre evaluó tanto el consecuente como la alternativa, mientras que el nuevo If solo evalúa uno de ellos.
Greg Hewgill
66
que significa ? If (condición, parte verdadera, parte falsa). puedo ritar?
kbvishnu
10
Soy un gran tipo C, pero encuentro esta sintaxis más limpia que el operador ternario tradicional.
aplastar
11
Otra distinción importante: Iifsiempre devuelve un objeto de tipo Object, mientras que If(bool, obj, obj)permite la verificación de tipo con la opción estrictamente activada. ( Dim var As Integer = Iif(true, 1, 2)no se compilará con la opción estrictamente activada porque podría Dim var As Integer = Iif(true, new Object(), new Object())escribir Dim var As Integer = If(true, 1, 2)con la misma facilidad . Sin embargo, PUEDE escribir con la opción estricta activada, ya que verificará el tipo devuelto.)
Joseph Nields
78

iif siempre ha estado disponible en VB, incluso en VB6.

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

No es un verdadero operador, como tal, sino una función en el espacio de nombres Microsoft.VisualBasic.

Kris Erickson
fuente
31
Sin embargo, Iif solo está cerca de un operador ternario, lo que significa que no podría usarlo en todas las condiciones en que lo haría con If Then Else (u operador ternario). Por ejemplo, Value = Iif (1 = 1, 0, 1/0) explotaría, pero Value = If (1 = 1, 0, 1/0) no ...
Beep beep
44
VB no admite la evaluación de Cortocircuito (a excepción del operador AndAlso), por lo que los programadores de VB realmente no esperan que puedan evaluar con seguridad la mitad de una operación. Pero punto tomado, también iif es una función de pirateo que se puso para compatibilidad con versiones anteriores, de lo contrario sería un operador real.
Kris Erickson
39
Es bueno clasificar a todos los programadores de VB ;-) Y también hay IsNot y OrElse para el acceso directo, por lo que VB realmente admite la Evaluación de cortocircuito.
HardCode
2
Iif es una llamada de método regular y evalúa todos los parámetros. No es ternario Se dotnetslackers.com/VB_NET/…
LosManos
3
Como dije, NO es un verdadero operador, y vb6 no admite la evaluación de cortocircuito, por lo que siempre evalúa todas las operaciones en línea.
Kris Erickson
23

If () es el equivalente más cercano, pero tenga cuidado con las conversiones implícitas si ha configurado "Option Strict off"

Por ejemplo, si no tiene cuidado, puede verse tentado a probar algo como:

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

¡Le dará a "foo" un valor de 0!

Creo que el '?' el operador equivalente en C # fallaría en su lugar la compilación

desconocido
fuente
8
Solo para completar, la mejor manera de escribir esa expresión es Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Mark Hurd
99
Tenga en cuenta que esto también sucede con Option Strict On. La razón es que Nothingen VB.NET es equivalente a C # en default(T)lugar de a null.
Heinzi
1
Y para cualquiera que esté perplejo Integer?, significa que es anulable - ver stackoverflow.com/questions/3628757/make-an-integer-null
AjV Jsy
1
Para cualquiera que se quede atascado en la conversión implícita para tipos anulables, vea esta respuesta sobre por qué y esta respuesta para una solución alternativa que arroja el argumento antes de devolver ( CType(Nothing, DateTime?).
KyleMit