当"其他方面"到达三元运算符?

时间:2016-12-14 15:57:30

标签: c# syntactic-sugar

注意:我之前有时会问过这个问题(abc),但这些问题都不在C#中,也没有帮助。

假设我使用? :这样的三元运算符(在false是这样的情况下什么都不做):

r==5? r=0 : <nothing> ;

我收到了错误消息。把东西放在那里显然可以解决问题。 如果不做一些随机的空函数,我怎么能保持对方空?

5 个答案:

答案 0 :(得分:22)

你做不到。条件?:运算符的重点是它评估表达式。你甚至不能只使用:

Foo() ? Bar() : Baz();

...因为那不是陈述。你必须对结果做些什么......就像你访问一个属性一样。

如果您只想在满足特定条件时执行一段代码,那么?:运算符不是您想要的 - 您需要if语句:

if (foo)
{
    bar();
}

就这么简单。不要试图将条件运算符扭曲成它本身并不存在的东西。

答案 1 :(得分:1)

当您显然需要两个参数时,为什么要使用三元?您只需使用if语句:

 if(Condition())Action();

答案 2 :(得分:1)

其他答案是正确的,但他们错过了一个关键点,我认为这是你遇到问题的主要问题。需要注意的是

r = 0

除了为r赋值外,还返回相同的值。你可以把它想象成一个功能。你可以调用一个函数,除了返回一个你可能会或可能不会使用的值之外,它可能会做一些其他的事情。

以例如:

int square(int n)
{
    // Now you can do other things here too. Maybe you do something with the UI in here:
    Console.WriteLine("Calculating...");
    // ^ Now thing of the above code as assigning a value to a variable.
    return n * n;
    // But after assigning the value, it also returns the value...
}

所以,现在假设您可能有两个用例:

var x = square(2);
// -- OR --
square(2);

请注意,这两个语句都会输出'Calculating ...',但前者会将2 * 24的值分配给x

更好的是,假设我们有一个功能:

int AssignValueToVariable(out int variable, int value)
{
    variable = value;
    return value;
}

现在这个功能显然是多余的,但我们假设我们可以用它来更好地理解。假设它等同于赋值=运算符。

那就是说,我们可以回到我们的场景。三元运算符<condition> ? <true expression> : <false expression>接受两个表达式,以根据指定的条件返回。所以,当你写:

r == 5 ? r = 0 : r = 2; // Let's suppose the third operand to be r = 2

相当于:

r == 5 ? AssignValueToVariable(r, 0) : AssignValueToVariable(r, 2)

两者基本上都是:

r == 5 ? 0 : 2

这带来了操作数必须是表达式的强硬规则,因为整个事物必须归结为表达式。因此,您可以使用默认值为表达式获取类型的'nothing'等价物。

或者,正如其他答案所提到的那样,使用if语句,简单明了:

if (r == 5)
    r = 0;

根据您提供的代码进行推断,我猜您正在使用已评估的表达式执行某些操作。您可以将值存储在单独的变量result中,并对其执行任何操作:

int result;
if (r == 5)
    result = r = 0; // This sets the value of both result and r to 0

现在,您可以将result替换为您想要的上一个表达式,即r == 5 ? r = 0 : <nothing> // Pseudo-code

希望有所帮助:)

答案 3 :(得分:1)

如果确实愿意,您现在可以使用Discard运算符来实现。

public class Program
{
    public static void Main()
    {
        int r=5;
        _ = r==5 ? r=0 : 0;
        Console.WriteLine($"{r}");
        // outputs 0
    }
}

您现在也可以

_=Foo() ? Bar() : Baz();

只要Bar和Baz返回相同或可转换的类型。

答案 4 :(得分:0)

我可以建议像这样的扩展方法:

public static T ChangeOn<T>(this T variable, bool condition, T newValue)
{
    return condition ? newValue : variable;
}

并像这样使用它:

var result = r.ChangeOn(r == 5, 0);
//or: r = r.ChangeOn(r == 5, 0); for self change