使用三元运算符,可以执行以下操作(假设 Func1() 和 Func2() 返回一个 int:
int x = (x == y) ? Func1() : Func2();
但是,有没有办法在不返回值的情况下做同样的事情?例如,类似(假设 Func1() 和 Func2() 返回 void):
(x == y) ? Func1() : Func2();
我意识到这可以使用 if 语句来完成,我只是想知道是否有办法做到这一点。
使用三元运算符,可以执行以下操作(假设 Func1() 和 Func2() 返回一个 int:
int x = (x == y) ? Func1() : Func2();
但是,有没有办法在不返回值的情况下做同样的事情?例如,类似(假设 Func1() 和 Func2() 返回 void):
(x == y) ? Func1() : Func2();
我意识到这可以使用 if 语句来完成,我只是想知道是否有办法做到这一点。
很奇怪,但你可以做到
class Program
{
private delegate void F();
static void Main(string[] args)
{
((1 == 1) ? new F(f1) : new F(f2))();
}
static void f1()
{
Console.WriteLine("1");
}
static void f2()
{
Console.WriteLine("2");
}
}
我不这么认为。据我所知,三元运算符用于表达式上下文而不是语句。编译器需要知道表达式的类型,而不是void
真正的类型。
您可以尝试为此定义一个函数:
void iif(bool condition, Action a, Action b)
{
if (condition) a(); else b();
}
然后你可以这样称呼它:
iif(x > y, Func1, Func2);
但这并没有真正让你的代码更清晰......
如果您有信心,您将创建一个静态方法,其唯一目的是吸收表达式并“使其”成为一个语句。
public static class Extension
{
public static void Do(this Object x) { }
}
通过这种方式,您可以调用三元运算符并在其上调用扩展方法。
((x == y) ? Func1() : Func2()).Do();
或者,以几乎等效的方式,编写一个静态方法(如果你想使用这个“快捷方式”的类是有限的)。
private static void Do(object item){ }
...并以这种方式调用它
Do((x == y) ? Func1() : Func2());
但是,我强烈建议不要使用此“快捷方式”,原因与我之前的作者已经明确说明的原因相同。
不,因为三元运算符是表达式,而动作/无效函数是语句。你可以让它们 return object
,但我认为 if/else 块会使意图更加清晰(即,正在执行这些动作是因为它们的副作用而不是它们的值)。