使用三元运算符进行多个运算

use*_*679 15 c# operators

? :如果expression为true/false,如何使用三元条件执行多个操作?

wbsource = (exp) ? (Do one thing) : (Do second thing) wbsource = (exp) ? (Do one thing) (Do second thing) : (Do second thing)

例如:

为什么我不能在?和之间执行三次操作:

filename = (fp!=null) ? fp; Properties.Settings.Default.filename=fp; Properties.Settings.Default.Save; : Properties.Settings.Default.file;
Run Code Online (Sandbox Code Playgroud)

有了简单的if条件,我会用一种简单的方式写:

if(fp!null)
{
filename = fp;
Properties.Settings.Default.filename;
Properties.Settings.Default.Save();
}
else
{
filename = Properties.Settings.Default.file
}
Run Code Online (Sandbox Code Playgroud)

使用上述三元运算符编写的简短方法是什么?

Jon*_*eet 19

为什么我不能在两者之间执行三次操作?并且:

因为这些是操作数,它们是表达式.每个表达式都会计算一个值; 你想要多个陈述.来自Eric Lippert 关于foreachvsForEach博文:

第一个原因是这样做违反了所有其他序列运算符所基于的函数式编程原则.显然,调用此方法的唯一目的是引起副作用.

表达式的目的是计算一个值,而不是引起副作用.声明的目的是产生副作用.这个东西的调用站点看起来很像一个表达式(但是,诚然,由于该方法是void返回的,因此表达式只能用于"语句表达式"上下文.)

你绝对应该用if块来写这个.它更清楚.

如果你真的,真的想使用条件运算符,你可以写:

// Please, please don't use this.
Func<string> x = () => {
    Properties.Settings.Default.filename = fp;
    Properties.Settings.Default.Save();
    return fp;
};

string filename = fp == null ? Properties.Settings.Default.file : x();
Run Code Online (Sandbox Code Playgroud)

  • 为什么不匿名内联声明函数(笑话) (2认同)

Jon*_*n B 9

条件运算符是三元运算符(不是一元运算符),不能替代if语句.它是一个返回两个结果之一的运算符.虽然你可以在某种程度上链接这个:

var result = someBool ? "a" : (otherBool ? "b" : "c");
Run Code Online (Sandbox Code Playgroud)

这有点难以阅读.此外,您正在尝试调用Save()函数,该函数不返回结果,因此您无法将此函数与此运算符一起使用.