和其他C风格的语言一样,C#有?
个三元运算符.然而,这并不完全等同于IIf()
;有两个重要的区别.
为了解释第一个区别,这个IIf()
调用的false part参数会导致DivideByZeroException
,即使布尔参数是True
.
IIf(true, 1, 1/0)
IIf()
只是一个函数,和所有函数一样,在调用之前必须计算所有参数.换句话说,在传统意义上,IIf()
并不意味着not短路.另一方面,这个三元表达式不会短路,因此非常好:
(true)?1:1/0;
另一个区别是IIf()
不是类型安全的.它接受并返回Object
类型的参数.三元运算符is类型安全.它使用类型推断来知道它处理的是什么类型.注意:使用您自己的通用IIF(Of T)()
实现可以非常容易地解决这个问题,但开箱即用不是这样的.
如果你真的想要IIf()
英寸C#,你可以:
object IIf(bool expression, object truePart, object falsePart)
{return expression?truePart:falsePart;}
或通用/类型安全实现:
T IIf<T>(bool expression, T truePart, T falsePart)
{return expression?truePart:falsePart;}
另一方面,如果希望在VB中使用三元运算符,Visual Studio 2008及更高版本将提供一个新的If()
operator,其工作原理与C#的三元运算符类似.它使用类型推断来知道它返回的是什么,它实际上是一个运算符而不是一个函数.这意味着预计算表达式没有问题,即使它有函数语义.