c# - C# 中的 Iif 等价物

标签 c# .net conditional-operator iif-function

在 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/

相关文章:

.net - 什么是托管 C++ 等效于 C# using 语句

java - 使用三元运算符与字节变量类型不匹配

c# - 有人可以解释这里发生的Parallel.ForEach循环逻辑吗?

c# - 如何在运行时更改资源字典颜色

C# 如何找到类的非创建对象?

如果连接失败,C# 总是重试 tcp 连接

c# - 登录 ASP.NET 网站时出现 fatal error 9001

c# - 组织 WinForm 控件代码

c++ - 三元运算符是否以定义的方式短路

erlang - Erlang "a==b ? X : Y"怎么写,也就是C 风格的三元运算符怎么写?