C#中的三元运算符
使用三元运算符,可以执行以下操作(假设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());
但是我强烈建议不要使用这个“捷径”,原因与我之前作者已明确说明的原因相同。
不,因为三元运算符是表达式,而actions / void函数是语句。 你可以让它们返回object
,但我认为if / else块会使意图更加清晰(即正在为其副作用而不是它们的值执行动作)。
- 如何在每个单元格中设置具有不同DataSource的DataGridView ComboBoxColumn?
- 用于在C#2.0中同步两个IList的最佳算法
- 使用命名的互斥锁来锁定文件
- 在AssemblyInfo.cs中引用项目时,发布预编译的ASP.NET失败
- System.Net.CertificatePolicy到ServerCertificateValidationCallback接受所有证书策略
- 如何获取变量的编译时类型?
- 奇怪的反编译代码来自generics类中的事件订阅代码
- Microsoft.Office.Interop.Outlook 2010在VS 2012中使用.Net 2.0参考
- 在可变类型中实现IEquatable