在VB.NET中有条件三元运算符吗?

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

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

在VB.NET中是否有类似的操作符?

265964 次浏览

取决于版本。VB中的If操作符。NET 2008是一个三元运算符(以及一个空合并运算符)。这是刚刚推出的,在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)

iif在VB中一直是可用的,甚至在VB6中也是如此。

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

它本身并不是一个真正的运算符,而是Microsoft中的一个函数。VisualBasic名称空间。

If()是最接近的等价,但如果你设置了Option Strict off,则隐式的当心转换将继续进行。

例如,如果你不小心,你可能会尝试这样的事情:

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

将给foo一个值0!

我认为c#中等价的?操作符反而会导致编译失败。

为了记录,下面是如果国际金融协会之间的区别:

IIf(条件,真部分,假部分):

  • 这是旧的VB6/VBA函数
  • 该函数总是返回一个对象类型,所以如果你想使用所选对象的方法或属性,你必须使用DirectCast或CType或Convert重新转换它。函数恢复到原始类型
  • 正因为如此,如果真部分和假部分是不同类型的,就没有关系,结果只是一个对象

If(条件,真部分,假部分):

  • 这是新的VB。网络功能
  • 结果类型是所选部分的类型,真部分或假部分
  • 如果打开了严格模式,而这两个部分是不同的类型,这是行不通的。在严格模式下,它们必须是相同的类型,否则你会得到一个异常
  • 如果你真的需要有两个不同类型的部分,关闭严格模式(或使用IIf)
  • 到目前为止,我还没有尝试严格模式是否允许不同类型的对象继承自相同的基或实现相同的接口。对于这个问题,微软文档并没有太大帮助。也许这里有人知道。
If(<expression>, <expressionIfNothing>)

如果<expression>计算为一个不是Nothing的引用或Nullable值,函数将返回该值。否则,它计算并返回<expressionIfNothing>(智能感知)


这对于检查特定值是否存在以及是否替换它非常有用。

例子:

If(cat, dog)

在这里,如果cat不为null,它将返回cat。如果为空,则返回dog。在这种情况下,大多数情况下您将使用三元运算符。然而,如果你不想返回你正在测试的值,你将不得不使用这个代替:

If(condition, cat(true), dog(false))