在 C# 中是否有等效的 If
?或者类似的捷径?
最佳答案
与其他 C 风格语言一样,C# 有 ?
三元运算符。但是,这并不完全等同于 IIf()
;有两个重要区别。
为了解释第一个区别,此 IIf()
调用的假部分参数会导致 DivideByZeroException
,即使 bool 参数为 True
。
IIf(true, 1, 1/0)
IIf()
只是一个函数,与所有函数一样,所有参数都必须在调用之前进行评估。换句话说,IIf()
不是传统意义上的短路。另一方面,这个三元表达式确实短路了,所以完全没问题:
(true)?1:1/0;
另一个区别是 IIf()
不是类型安全的。它接受并返回 Object
类型的参数。三元运算符是类型安全的。它使用类型推断来了解它正在处理的类型。请注意,您可以使用自己的通用 IIF(Of T)()
实现非常轻松地解决此问题,但开箱即用的方式并非如此。
如果你真的想要在 C# 中使用 IIf()
,你可以拥有它:
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# 的三元运算符。它使用类型推断来了解它返回的是什么,它实际上是一个运算符而不是一个函数。这意味着预评估表达式没有问题,即使它具有函数语义。
关于c# - C# 中的 Iif 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/822810/