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

Is there a conditional ternary operator in VB.NET?

提问人:Jim Counts 提问时间:2/23/2009 最后编辑:Stephen KennedyJim Counts 更新时间:2/25/2022 访问量:283013

问:

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

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

VB.NET 有类似的运营商吗?

vb.net 算子 条件算 短路

评论

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

答:

669赞 Beep beep 2/23/2009 #1

取决于版本。VB.NET 2008 中的运算符是三元运算符(以及零合并运算符)。这是刚刚推出的,在 2008 年之前不可用。下面是一些详细信息:Visual Basic If 公告If

例:

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

[编辑]

在 2008 年之前,它的工作方式与上述运算符几乎相同。IIfIf

例:

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

评论

17赞 Zooba 2/23/2009
在 2008 年之前,它是 IIf,它的工作方式与您的链接中描述的 If 运算符几乎相同。
149赞 Greg Hewgill 2/23/2009
...重要的区别是 Iif() 作为一个函数,总是同时计算结果函数和备选函数,而新的 If 只计算其中之一。
6赞 kbvishnu 1/20/2012
这是什么意思?如果 (condition,true-part,false-part)。我可以参加仪式吗?
13赞 crush 2/11/2015
我是一个非常喜欢 C 的人,但我发现这种语法比传统的三元运算符更干净。
13赞 Joseph Nields 4/21/2015
另一个重要的区别是:总是返回一个类型的对象,而允许在选项严格打开的情况下进行类型检查。(不会在选项严格开启的情况下编译,因为您可以很容易地编写.不过,您可以在 option strict on 上写入,因为它会检查返回的类型。IifObjectIf(bool, obj, obj)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)
84赞 Kris Erickson 2/23/2009 #2

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

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

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

评论

33赞 Beep beep 2/23/2009
不过,Iif 只接近三元运算符 - 这意味着您不能在 If Then Else(或三元运算符)的所有条件下使用它。例如,Value = Iif(1 = 1, 0, 1/0) 会爆炸,但 Value = If(1 = 1, 0, 1/0) 不会......
4赞 Kris Erickson 2/23/2009
VB 不支持短路计算(AndAlso 运算符除外),因此 VB 程序员并不真正期望他们可以安全地评估一半的操作。但要注意的是,iif 也是一个 hack 函数,是为了向后兼容而放入的,否则它将是一个真正的操作员。
39赞 HardCode 2/24/2009
很高兴对所有 VB 程序员进行分类;-)并且还有 IsNot 和 OrElse 可以快捷,所以 VB 确实支持短路评估。
3赞 LosManos 12/19/2012
Iif 是一个常规方法调用,用于评估所有参数。它不是三元的。Se dotnetslackers.com/VB_NET/...
4赞 Kris Erickson 12/19/2012
正如我所说,它不是一个真正的运算符,vb6 不支持短路评估,所以它总是在线评估所有操作。
28赞 unnknown 8/16/2012 #3

If()是最接近的等价物,但如果您设置了 ,请注意正在进行的隐式转换。Option Strict off

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

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

将给出一个值 !foo0

我认为 C# 中的等效运算符反而会失败编译。?

评论

9赞 Mark Hurd 2/4/2015
为了完整起见,写该表达式的更好方法是 .Dim foo As Integer? = If( someTrueExpression, New Integer?, 2)
12赞 Heinzi 12/10/2015
请注意,这种情况也会发生在 中。原因是 in VB.NET 等价于 C# 而不是 .Option Strict OnNothingdefault(T)null
2赞 AjV Jsy 6/17/2016
对于任何对此感到困惑的人,这意味着它是可为空的 - 请参阅 stackoverflow.com/questions/3628757/make-an-integer-nullInteger?
3赞 KyleMit 1/18/2017
对于任何在可为 null 类型的隐式转换上遇到困难的人 - 请参阅此答案以了解原因,以及此答案以获取在返回 () 之前强制转换参数的解决方法。CType(Nothing, DateTime?
3赞 Aranxo 12/5/2020 #4

仅供记录,以下是 IfIIf 之间的区别:

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

  • 这是旧的VB6 / VBA函数
  • 该函数始终返回 Object 类型,因此,如果要使用所选对象的方法或属性,则必须使用 DirectCast 或 CType 或 Convert 将其重新强制转换为其原始类型。 函数转换为其原始类型
  • 正因为如此,如果 true-part 和 false-part 是不同类型的,那就没关系了,结果无论如何都只是一个对象

如果(条件、真部分、假部分):

  • 这是新的 VB.NET 功能
  • 结果类型是所选部件的类型,即真部件或假部件
  • 如果打开了严格模式并且这两个部分属于不同的类型,则这不起作用。在严格模式下,它们必须属于同一类型,否则您将收到异常
  • 如果确实需要两个不同类型的部件,请关闭严格模式(或使用 IIf)
  • 到目前为止,我还没有尝试过严格模式是否允许不同类型的对象,但继承自相同的基础或实现相同的接口。Microsoft 文档对此问题不太有帮助。也许这里有人知道。
0赞 Eli Fry 1/12/2022 #5
If(<expression>, <expressionIfNothing>)

如果计算结果为非 Nothing 的引用或可为 Null 值,则该函数将返回该值。否则,它将计算并返回 (Intellisense)<expression><expressionIfNothing>


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

例:

If(cat, dog)

这里,如果 cat 不为 null,它将返回 cat。如果为 null,则返回 dog。大多数情况下,对于此方案,您将使用三元运算符。但是,如果您不想返回正在测试的值,则必须改用它:

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

评论

0赞 Eli Fry 2/25/2022
我的答案添加到现有的答案中,它不会反映在可接受的答案中,如果这是他们使用它的用例,可能会更简单。不幸的是,我没有足够的声誉来评论该帖子来分享我的更新。