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

Jim*_*nts 426 vb.net operators conditional-operator short-circuiting

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

my $foo = $bar == $buz ? $cat : $dog;
Run Code Online (Sandbox Code Playgroud)

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

Bee*_*eep 571

取决于版本.在If2008年VB.NET运算符是一个三元操作(以及空聚结操作者).这是刚刚推出的,在2008年之前没有这个.这里有一些更多的信息: Visual Basic如果公告

例:

Dim foo as String = If(bar = buz, cat, dog)
Run Code Online (Sandbox Code Playgroud)

  • ... Iif()作为一个函数的重要区别是,总是评估结果和替代,而新的If只评估其中一个. (124认同)
  • 在2008年之前,它是IIf,它几乎与链接中描述的If运算符相同. (15认同)
  • 另一个重要的区别:`Iif`总是返回一个类型为`Object`的对象,而`If(bool,obj,obj)`允许使用option strict on进行类型检查.(`Dim var As Integer = Iif(true,1,2)`将无法使用option strict编译,因为您可以轻松地编写`Dim var As Integer = Iif(true,new Object(),new Object()你可以写'Dim var As Integer = If(true,1,2)`with option strict on,因为它会检查返回的类型.) (11认同)
  • 我是一个巨大的C家伙,但我发现这种语法比传统的三元运算符更清晰. (8认同)
  • 这是什么意思?如果(condition,true-part,false-part).我可以举个仪式吗? (6认同)

Kri*_*son 74

即使在VB6中,iif也一直在VB中可用.

Dim foo as String = iif(bar = buz, cat, dog)
Run Code Online (Sandbox Code Playgroud)

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

  • 很高兴对所有VB程序员进行分类;-)并且还有IsNot和OrElse的快捷方式,因此VB确实支持短路评估. (36认同)
  • 虽然Iif只接近三元运算符 - 这意味着你不能在If Then Else(或三元运算符)的每个条件下使用它.例如,Value = Iif(1 = 1,0,1/0)会爆炸,但Value = If(1 = 1,0,1/0)不会...... (30认同)
  • VB不支持短路评估(AndAlso运算符除外),因此VB程序员并不真正期望他们可以安全地评估半个操作.但是要点,iif也是一个黑客功能,为了向后兼容而放置,否则它将是一个真正的运营商. (3认同)
  • Iif 是一个常规方法调用并评估所有参数。它不是三元的。Se http://dotnetslackers.com/VB_NET/re-55021_IIF_becomes_If_and_a_true_ternary_operator.aspx (3认同)
  • 正如我所说,它不是一个真正的运算符,并且vb6不支持短路评估,所以它总是评估所有在线操作. (2认同)

unn*_*own 24

如果()是最接近的等价物,但如果设置了"Option Strict off",请注意隐式转换

例如,如果您不小心,可能会尝试尝试以下方法:

Dim foo As Integer? = If( someTrueExpression, Nothing, 2)
Run Code Online (Sandbox Code Playgroud)

将"foo"赋值为0!

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

  • 为了完整起见,编写该表达式的更好方法是"Dim foo As Integer?= If(someTrueExpression,New Integer?,2)`. (8认同)
  • 请注意,"Option Strict On"也会发生这种情况.原因是VB.NET中的"Nothing"等同于C#的`default(T)`而不是`null`. (8认同)
  • 对于任何陷入可为空类型的隐式转换的人 - 请参阅[这个答案说明原因](http://stackoverflow.com/a/4190323/1366033) 和[这个解决方法的答案](http://stackoverflow.com /a/4191039/1366033) 在返回之前强制转换参数 (`CType(Nothing, DateTime?`)。 (3认同)
  • 对于任何对“Integer?”感到困惑的人,这意味着它可以为空 - 请参阅http://stackoverflow.com/questions/3628757/make-an-integer-null (2认同)