Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的三元算子#_C#_.net_Methods_Ternary Operator - Fatal编程技术网

C# C语言中的三元算子#

C# C语言中的三元算子#,c#,.net,methods,ternary-operator,C#,.net,Methods,Ternary Operator,使用三元运算符,可以执行以下操作(假设Func1()和Func2()返回int): int x = (x == y) ? Func1() : Func2(); 但是,是否有任何方法可以在不返回值的情况下执行相同的操作?例如,类似(假设Func1()和Func2()返回void): 我意识到这可以通过使用if语句来实现,我只是想知道是否有这样的方法。没有,因为三元运算符是一个表达式,而actions/void函数是语句。你可以让它们返回object,但我认为if/else块会让意图更清楚(也就是

使用三元运算符,可以执行以下操作(假设Func1()和Func2()返回int):

int x = (x == y) ? Func1() : Func2();
但是,是否有任何方法可以在不返回值的情况下执行相同的操作?例如,类似(假设Func1()和Func2()返回void):


我意识到这可以通过使用if语句来实现,我只是想知道是否有这样的方法。

没有,因为三元运算符是一个表达式,而actions/void函数是语句。你可以让它们返回
object
,但我认为if/else块会让意图更清楚(也就是说,执行操作是为了产生副作用,而不是它们的值)。

我不这么认为。据我所知,三元运算符用于表达式上下文中,而不是作为语句。编译器需要知道表达式的类型,而
void
并不是真正的类型

您可以尝试为此定义一个函数:

void iif(bool condition, Action a, Action b)
{
    if (condition) a(); else b();
}
然后你可以这样称呼它:

iif(x > y, Func1, Func2);

但这并不能让你的代码变得更清晰…

奇怪,但你可以这么做

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");
    }
}

如果您有信心,您应该创建一个静态方法,其唯一目的是吸收表达式并“使其成为”语句

public static class Extension
{
    public static void Do(this Object x) { }
}
通过这种方式,您可以调用三元运算符并对其调用扩展方法

((x == y) ? Func1() : Func2()).Do(); 
或者,以一种几乎相同的方式,编写一个静态方法(如果希望使用此“快捷方式”的类受到限制)

…这样称呼它

Do((x == y) ? Func1() : Func2());

然而,我强烈建议不要使用这个“快捷方式”,原因与我之前的作者已经明确指出的相同。

很抱歉吹毛求疵,但正确的名称是条件运算符@Brian:在同一篇文章中,“它有时也称为三元运算符”.所以,这两种方法都是用的。@Nelson-以这样的方式,求和符号也可以称为二元运算符,递增运算符也可以称为一元运算符?是的……但它仍然不是一种正确的命名方式,尽管它通常是唯一已知的三元运算符。(还有更多吗?好问题。)是的,三元运算符(以及相关的名称,如一元、二元)是更广义的名称。因此,条件运算符是三元运算符(如果语言语法不提供另一个,则为“三元”运算符),但三元运算符不一定是条件运算符。我认为在编程语言的上下文中,这两种运算符通常都被理解为同一个意思。除非像你所说的有更多。在谷歌搜索“C#“三元运算符”和“C#“条件运算符”'返回了相似数量的结果,因此它们的使用频率似乎大致相同。为了避免只使用“if”和“else”,这需要做大量额外的工作。不过代码片段很好。
private static void Do(object item){ }
Do((x == y) ? Func1() : Func2());