C# “当”时什么也不做;“另一边”;达到三元算子的极限?

C# “当”时什么也不做;“另一边”;达到三元算子的极限?,c#,syntactic-sugar,C#,Syntactic Sugar,注意:我以前见过有人问过这个问题(,),但这两个问题都不是C#,也没有帮助 假设我正在使用?:三元运算符(在出现false时不执行任何操作): r==5?r=0:; 我有个错误。把东西放在那里显然能解决问题。 我怎样才能保持另一端为空,而不产生一些随机的空函数?你不能。条件?:运算符的全部要点是它对表达式求值。你甚至不能仅仅使用: Foo() ? Bar() : Baz(); 。。。因为这不是一个声明。你必须对结果做点什么。。。例如,就像访问属性一样 如果您只想在满足特定条件时执行一段代码,

注意:我以前见过有人问过这个问题(,),但这两个问题都不是C#,也没有帮助

假设我正在使用
?:
三元运算符(在出现
false
时不执行任何操作):

r==5?r=0:;
我有个错误。把东西放在那里显然能解决问题。
我怎样才能保持另一端为空,而不产生一些随机的空函数?

你不能。条件?:运算符的全部要点是它对表达式求值。你甚至不能仅仅使用:

Foo() ? Bar() : Baz();
。。。因为这不是一个声明。你必须对结果做点什么。。。例如,就像访问属性一样

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

if (foo)
{
    bar();
}
 if(Condition())Action();

就这么简单。不要试图将条件运算符扭曲成它不应该是的东西。

当您显然需要两个参数时,为什么要使用三元运算符?您可以简单地使用if语句:

if (foo)
{
    bar();
}
 if(Condition())Action();

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

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);
请注意,这两个语句都输出“计算…”,但前者将
2*2
4
的值赋给
x

更好的是,假设我们有一个函数:

int AssignValueToVariable(out int variable, int value)
{
    variable = value;
    return value;
}
现在这个函数显然是多余的,但是我们假设我们可以使用它来更好地理解它。假设它等价于赋值
=
运算符

也就是说,我们可以回到我们的场景。三元运算符
?:接受两个表达式以根据指定的条件返回。所以,当你写作时:

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://伪代码


希望有帮助:)

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

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

如果您真的想,现在可以使用操作符实现这一点

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返回相同的或可转换的类型。

你能给出一个非psuedo代码的例子吗?当你知道你不想为一种情况做任何事情时,三元(条件)运算符的用法可能重复?@krillgar
r==5?r=0:
如果你真的想使用条件表达式,你可以使用
r=(r==5?0:r)
但是你应该使用
If
语句,即
If(r==5){r=0;}
这就像说你想调用bar()。我的例子有点不对劲,我将它更新为现在应该的状态。@devRicher:原理保持不变。@devRicher:更糟糕的是,您的第二个操作数现在是一个副作用操作数。你到底想完成什么?听起来你想要
如果(r==5){r=0;}
。如果这就是你想要的,为什么不使用它?@devRicher:你是说你想让它变成0,1,2,3,4,0,1,2,3,4等等?如果是这样,您需要:
r=(r+1)%5。同样,不需要条件运算符,因为在查看整个代码监视器时,许多人比英语语句更擅长快速、准确地读取逻辑符号。可以高效读取的语法是高效的编码。这包括以英语为母语的人。任何包含许多括号的东西,它们延伸到小写字母的上方和下方,都会极大地增加整个屏幕的视觉噪音。