VB.NET中是否有条件三元运算符?


445

在Perl(和其他语言)中,条件三元运算符可以这样表示:

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

VB.NET中是否有类似的运算符?


13
三元运算符是采用三个操作数的任何运算符,就像二元运算符采用两个而一元运算符采用一个一样。?:运算符是ternay运算符的特定示例,而不是定义。
Zooba

Answers:


596

取决于版本。在If2008年VB.NET运算符是一个三元操作(以及空聚结操作者)。这是刚刚介绍的,在2008年之前不可用。这是更多信息: Visual Basic If公告

例:

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

[编辑]

在2008年之前IIf,它的工作原理与上述If运营商几乎相同。

例:

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

15
在2008年之前,它是IIf,其工作原理与链接中所述的If运算符几乎相同。
Zooba

128
...的重要区别在于,作为函数的Iif()总是评估结果变量和替代变量,而新的If仅评估其中之一。
Greg Hewgill

6
这是什么意思?如果(条件,真部分,假部分)。我可以礼拜吗?
kbvishnu 2012年

10
我是一个大C家伙,但我发现此语法比传统的三元运算符更干净。
暗恋

11
另一个重要的区别是:Iif始终返回type的对象Object,而If(bool, obj, obj)允许使用选项strict on进行类型检查。(Dim var As Integer = Iif(true, 1, 2)不会编译严格选项,因为您可以很容易地编写Dim var As Integer = Iif(true, new Object(), new Object())。但是可以严格编译选项Dim var As Integer = If(true, 1, 2),因为它会检查返回的类型。)
Joseph Nields 2015年

78

iif一直在VB中可用,即使在VB6中也是如此。

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

这样,它不是一个真正的运算符,而是Microsoft.VisualBasic命名空间中的一个函数。


31
虽然Iif仅接近三元运算符-这意味着您不能在所有条件下都使用If If Else(或三元运算符)。例如,值= Iif(1 = 1,0,1/0)会爆炸,但值= If(1 = 1,0,1/0)不会...
哔哔声

4
VB不支持短路评估(AndAlso运算符除外),因此VB程序员并不真正希望他们可以安全地评估一半操作。但要指出的是,iif也是为了向后兼容而引入的hack函数,否则它将是真正的运算符。
克里斯·埃里克森

39
很高兴将所有VB程序员归类;-)而且快捷方式还有IsNot和OrElse,因此VB确实支持短路评估。
HardCode

2
Iif是常规方法调用,并评估所有参数。它不是三元的。硒 dotnetslackers.com/VB_NET/...
LosManos

3
如我所说,它不是真正的运算符,并且vb6不支持短路评估,因此无论如何它总是评估在线的所有操作。
克里斯·埃里克森

23

If()是最接近的等效项,但是请注意,如果您已将“ Option Strict off”设置为“ off”,则会进行隐式转换

例如,如果您不小心,则可能会尝试以下操作:

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

将“ foo”的值设为0!

我觉得 '?' C#中等效的运算符将导致编译失败


8
仅出于完整性考虑,编写该表达式的更好方法是Dim foo As Integer? = If( someTrueExpression, New Integer?, 2)
马克·赫德

9
请注意,这也会发生Option Strict On。原因是Nothing在VB.NET中等效于C#default(T)而不是null
Heinzi 2015年

1
对于任何对此感到困惑的人,Integer?它意味着它可以为空-参见stackoverflow.com/questions/3628757/make-an-integer-null
AjV Jsy

1
对于任何陷入可空类型的隐式转换的人,请参阅以下答案,了解原因以及解决此问题的方法该方法可在返回(CType(Nothing, DateTime?)之前强制转换参数。
KyleMit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.