什么是C#中的IIF?

abh*_*bhi 14 .net c# vb.net

可能重复:
cif中的iif等价物

IIf在VB中使用了几行代码,我试图将此代码转换为C#.

这是我需要帮助的一个例子:

intCurrency = IIf(or.Fields("Currency").Value = "USD", 100, 0)
Run Code Online (Sandbox Code Playgroud)

如何将上面的代码行更改为C#?C#中是否有短路评估操作符?

Jar*_*Par 38

有几个人建议它接近 C#三元/条件运算符,但它不是一个确切的替代品.C#三元运算符执行短路评估,这意味着只会发生评估子句的副作用.在VB.Net中,该Iif功能不实现短路,并将评估两种副作用.

另外Iif,VB.Net中的函数是弱类型的.它接受并返回键入的值Object.C#三元运算符是强类型的.

您可以写的最接近的等价物如下.将值放入参数会强制评估其副作用.

public static object Iif(bool cond, object left, object right) {
  return cond ? left : right;
}
Run Code Online (Sandbox Code Playgroud)

或稍微更有用

public static T Iif<T>(bool cond, T left, T right) {
  return cond ? left : right;
}
Run Code Online (Sandbox Code Playgroud)

  • +1,不仅是最接近的等价物,而且我说完全等同于公共的Microsoft.VisualBasic.Interaction.IIf方法,可以使用Reflector看到.但只是为了迂腐,在VB.NET中,IIf是一个函数而不是运算符. (2认同)

jos*_*736 16

是的,这是问号(AKA是条件运算符).

intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,@ josh3736并不等同于此.C#三元运算符既短路又强类型,而VB.Net`iif`运算符都不是. (3认同)

Bri*_*eon 5

IIf这是令人难以置信的迂腐,但C# 中最接近的等价物是

intCurrency = ((Func<bool, object, object, object>)((x, y, z) => x ? y : z))(or.Fields["Currency"].Value == "USD", 100, 0);
Run Code Online (Sandbox Code Playgroud)

不过,我不知道你是否真的对VB的三元运算符感兴趣。所以在VB中如下

intCurrency = IIf(or.Fields("Currency").Value = "USD", 100, 0) 
Run Code Online (Sandbox Code Playgroud)

可以更好地写成(注意IIf和之间的区别If

intCurrency = If(or.Fields("Currency").Value = "USD", 100, 0) 
Run Code Online (Sandbox Code Playgroud)

这与 C# 中的完全相同

intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
Run Code Online (Sandbox Code Playgroud)

另一个有趣的点是它If兼作空合并运算符。

Dim text As String = Nothing
text = If(text, "Nothing")
Run Code Online (Sandbox Code Playgroud)

这与 C# 中的完全相同

string text = null;
text = text ?? "null";
Run Code Online (Sandbox Code Playgroud)