注意:我之前有时会问过这个问题(a,b,c),但这些问题都不在C#中,也没有帮助。
假设我使用? :
这样的三元运算符(在false
是这样的情况下什么都不做):
r==5? r=0 : <nothing> ;
我收到了错误消息。把东西放在那里显然可以解决问题。 如果不做一些随机的空函数,我怎么能保持对方空?
答案 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 * 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
这带来了操作数必须是表达式的强硬规则,因为整个事物必须归结为表达式。因此,您可以使用默认值为表达式获取类型的'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