Gibt es in VB.NET einen bedingten ternären Operator?

446

In Perl (und anderen Sprachen) kann ein bedingter ternärer Operator folgendermaßen ausgedrückt werden:

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

Gibt es einen ähnlichen Operator in VB.NET?

Jim zählt
quelle
13
Ein ternärer Operator ist ein Operator, der drei Operanden benötigt, ähnlich wie ein binärer Operator zwei und ein unärer Operator einen. Der Operator ?: Ist ein spezifisches Beispiel für einen ternay-Operator, nicht die Definition.
Zooba

Antworten:

597

Hängt von der Version ab. Der IfOperator in VB.NET 2008 ist ein ternärer Operator (sowie ein Null-Koaleszenz-Operator). Dies wurde gerade eingeführt, vor 2008 war dies nicht verfügbar. Hier einige weitere Informationen: Visual Basic If-Ankündigung

Beispiel:

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

[BEARBEITEN]

Vor 2008 war es das IIf, was fast identisch mit dem oben Ifbeschriebenen Betreiber funktionierte .

Beispiel:

Dim foo as String = IIf(bar = buz, cat, dog)
Piep Piep
quelle
15
Vor 2008 war es IIf, das fast identisch mit dem in Ihrem Link beschriebenen If-Operator funktionierte.
Zooba
128
... mit dem wichtigen Unterschied, dass Iif () als Funktion immer sowohl die Konsequenz als auch die Alternative bewertet, während das neue If nur eine davon bewertet.
Greg Hewgill
6
was bedeutet das If (Bedingung, wahrer Teil, falscher Teil). darf ich riten?
kbvishnu
10
Ich bin ein großer C-Typ, aber ich finde diese Syntax sauberer als den traditionellen ternären Operator.
Crush
11
Ein weiterer wichtiger Unterschied: IifGibt immer ein Objekt vom Typ zurück Object, während If(bool, obj, obj)die Typprüfung mit der Option strict on möglich ist. ( Dim var As Integer = Iif(true, 1, 2)Kompiliert nicht mit Option strict on, da Sie genauso einfach schreiben können Dim var As Integer = Iif(true, new Object(), new Object()). Sie können jedoch Dim var As Integer = If(true, 1, 2)mit option strict on schreiben , da der zurückgegebene Typ überprüft wird.)
Joseph Nields
78

iif war schon immer in VB verfügbar, auch in VB6.

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

Es ist kein echter Operator als solcher, sondern eine Funktion im Microsoft.VisualBasic-Namespace.

Kris Erickson
quelle
31
Iif ist jedoch nur in der Nähe eines ternären Operators - was bedeutet, dass Sie ihn nicht in jeder Bedingung verwenden können, in der Sie einen If Then Else (oder einen ternären Operator) verwenden würden. Zum Beispiel würde Value = Iif (1 = 1, 0, 1/0) explodieren, aber Value = If (1 = 1, 0, 1/0) würde nicht ...
Beep Beep
4
VB unterstützt keine Kurzschlussauswertung (mit Ausnahme des AndAlso-Operators), sodass VB-Programmierer nicht wirklich erwarten, dass sie eine halbe Operation sicher auswerten können. Aber Punkt genommen, auch iif ist eine Hack-Funktion, die aus Gründen der Abwärtskompatibilität eingesetzt wurde, sonst wäre es ein echter Operator.
Kris Erickson
39
Schön, alle VB-Programmierer zu kategorisieren ;-) Und es gibt auch IsNot und OrElse als Verknüpfung, sodass VB tatsächlich die Kurzschlussbewertung unterstützt.
HardCode
2
Iif ist ein regulärer Methodenaufruf und wertet alle Parameter aus. Es ist nicht ternär. Se dotnetslackers.com/VB_NET/…
LosManos
3
Wie ich bereits sagte, handelt es sich NICHT um einen echten Operator, und vb6 unterstützt keine Kurzschlussauswertung, sodass ohnehin immer alle Vorgänge online ausgewertet werden.
Kris Erickson
23

Wenn () das nächste Äquivalent ist, achten Sie jedoch auf implizite Konvertierungen, wenn Sie "Option Strict off" aktiviert haben.

Wenn Sie beispielsweise nicht aufpassen, könnten Sie versucht sein, Folgendes zu versuchen:

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

Gibt "foo" den Wert 0!

Ich denke, die '?' Das in C # äquivalente Operator würde stattdessen die Kompilierung fehlschlagen

unbekannt
quelle
8
Der Vollständigkeit halber ist der bessere Weg, diesen Ausdruck zu schreiben Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Mark Hurd
9
Beachten Sie, dass dies auch bei passiert Option Strict On. Der Grund dafür ist, dass Nothingin VB.NET default(T)eher C # als C # entspricht null.
Heinzi
1
Und für alle, die davon verwirrt sind Integer?, bedeutet dies, dass es nullbar ist - siehe stackoverflow.com/questions/3628757/make-an-integer-null
AjV Jsy
1
Wenn Sie bei der impliziten Konvertierung für nullfähige Typen nicht weiterkommen, lesen Sie in dieser Antwort nach, warum und in dieser Antwort eine Problemumgehung, die das Argument vor der Rückgabe ( CType(Nothing, DateTime?) umsetzt .
KyleMit