假设我写了以下代码:
int x = 42;
if (x.Equals(x = Foo()))
Console.WriteLine("ok");
其中Foo
是返回整数的任何方法。是否保证方法调用目标(第一个x
)在之前被评估,它被Foo()
的返回值替换?换句话说,当且仅当ok
的返回值等于42时,此代码才能保证打印Foo()
吗?
我已经看到了其他问题,这些问题涉及参数评估的顺序,但他们没有谈到在运行时为非静态方法评估实例(第一个x
)的时间 - - 有人可以为我澄清一下吗?
答案 0 :(得分:3)
这是一个名为Sequence Points的问题。这经常代表when you put increment operator inside an expression发生的事情。
在C#的情况下,严格定义表达式和method parameters从左到右,从内到外进行评估,并且任何赋值(以及一般的副作用)对于表达式的其余部分立即可见。
您可以阅读更多here。
答案 1 :(得分:1)
x = Foo()
,然后引用x
(左边的那个),因此,这个条件将始终为真。
void Main()
{
int x = 42;
if (x.Equals(x = Foo())) //This is always true.
Console.WriteLine(x); //0
Console.WriteLine("ok");
}
int Foo()
{
return 0;
}
答案 2 :(得分:0)
首先会执行Foo(),但我会这样写:
int x = 42;
if (x == Foo()) {
// ok
}
=将始终指定
==将比较两个值