Is there a conditional ternary operator in VB.NET?
在Perl(和其他语言)中,条件三元运算符可以这样表示:
1
| my $foo = $bar == $buz ? $cat : $dog; |
在vb.net中有类似的运算符吗?
- 三元运算符是取三个操作数的任何运算符,就像二元运算符取二,一元运算符取一。这个?:operator是三元运算符的特定示例,而不是定义。
- 是的,谢谢,但这些信息没有帮助。
- 这就是为什么它是一个评论,而不是一个答案。当我评论的时候,有一个正确的答案识别出了现在似乎已经消失的IIF。
取决于版本。vb.net 2008中的If运算符是三元运算符(以及空合并运算符)。这是刚推出的,在2008年之前,这是不可用的。以下是更多信息:Visual Basic if公告
例子:
1
| Dim foo as String = If(bar = buz, cat, dog) |
- 在2008年之前,它是IIF,其工作原理几乎与您的链接中描述的IF操作员相同。
- …重要的区别是,作为函数的iif()总是同时计算结果和可选项,而new if只计算其中的一个。
- 这是什么意思?如果(条件、真实部分、虚假部分)。我可以参加仪式吗?
- @是的。你说得对。
- 我是一个很大的C用户,但是我发现这个语法比传统的三元运算符更清晰。
- 另一个重要区别是:Iif总是返回Object类型的对象,而If(bool, obj, obj)允许在选项strict为on的情况下进行类型检查。(Dim var As Integer = Iif(true, 1, 2)不会使用选项strict on进行编译,因为您可以很容易地编写Dim var As Integer = Iif(true, new Object(), new Object())。但是,您可以在选项严格的情况下编写Dim var As Integer = If(true, 1, 2),因为它将检查返回的类型。)
IIF一直在VB中可用,甚至在VB6中也可用。
1
| Dim foo as String = iif(bar = buz, cat, dog ) |
它不是真正的运算符,而是Microsoft.VisualBasic命名空间中的函数。
- IIF只接近于一个三元运算符-这意味着你不能在任何条件下使用它,你会一个if-then-else(或三元运算符)。例如,value=iif(1=1,0,1/0)会爆炸,但是value=if(1=1,0,1/0)不会……
- vb不支持短路评估(除了andalso运算符),因此vb程序员并不期望他们能够安全地评估半个操作。但值得一提的是,IIF也是一个为向后兼容而加入的黑客函数,否则它将是一个真正的操作符。
- 很好地对所有的VB程序员进行分类;-)而且也没有快捷方式,所以VB确实支持短路评估。
- IIF是一个常规方法调用,并计算所有参数。它不是三元的。se dotneslackers.com/vb_net/…
- 正如我所说,它不是一个真正的运算符,而且VB6不支持短路评估,因此它总是在线评估所有操作。
- 方法IIF是Microsoft.VisualBasic命名空间的一部分,与其他.NET语言不兼容。所以更好的做法是使用if()方法。
- @aave:命名空间肯定与其他语言兼容,这个特定的函数一直都是无意义的,但这并不意味着命名空间中的所有内容都是无意义的,或者只能与vb一起使用。
if()是最接近的等价项,但如果设置了"Option Strict Off",则要注意隐式转换的进行。
例如,如果您不小心,您可能会尝试以下方法:
1
| Dim foo As Integer? = If( someTrueExpression, Nothing, 2) |
将给"foo"一个值0!
我想是"?"C中的等价运算符将导致编译失败
- 为了完整性起见,编写表达式的更好方法是Dim foo As Integer? = If( someTrueExpression, New Integer?, 2)。
- 注意,这也发生在Option Strict On上。原因是vb.net中的Nothing相当于c的default(T)而不是null。
- 对于任何对Integer?感到困惑的人来说,这意味着它是可以为空的-参见stackoverflow.com/questions/3628757/make-an-integer-null
- 对于任何一个陷入可为空类型的隐式转换的人来说——请看这个答案为什么,以及这个解决方案在返回之前强制转换参数(CType(Nothing, DateTime?)。