其他答案是正确的,但他们错过了一个关键点,我认为这是您遇到的主要问题。需要注意的是
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 * 2 或4 的值分配给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
这又带回了操作数必须是表达式的硬性规则,因为整个事物必须归结为一个表达式。因此,您可以通过使用表达式的默认值来获得表达式的种类“无”等价物。
或者,正如其他答案所提到的,使用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。
希望对你有帮助:)