评估==和C#中的等于有什么区别?
对于Ex,
if(x==x++)//Always returns true
但
if(x.Equals(x++))//Always returns false
编辑:
int x=0;
int y=0;
if(x.Equals(y++))// Returns True
答案 0 :(得分:12)
根据规范,这是预期的行为。
第一种行为受规范第7.3节的管辖:
表达式中的操作数从左到右进行计算。例如,在
F(i) + G(i++) * H(i)
中,使用旧值i调用方法F,然后使用旧值i调用方法G,最后,使用新值i调用方法H.这与运算符优先级分开,无关。
因此,在x==x++
中,首先评估左操作数(0
),然后评估右手(0
,x
变为1
),然后进行比较:0 == 0
为真。
第二种行为受第7.5.5节的约束:
- 如果M是在 value-type 中声明的实例函数成员:
- 评估E.如果此评估导致异常,则不执行进一步的步骤。
- 如果E未被归类为变量,则创建E类型的临时局部变量,并将E的值分配给该变量。然后将E重新分类为对该临时局部变量的引用。临时变量在M中可以访问,但不能以任何其他方式访问。因此,只有当E是真正的变量时,调用者才有可能观察到M对此做出的变化。
- 参数列表按照§7.5.1。
中的描述进行评估- 调用了M. E引用的变量成为由此引用的变量。
请注意,值类型通过引用传递给他们自己的方法。
因此,在x.Equals(x++)
中,首先评估目标(E是x
,一个变量),然后评估参数(0
,x
变为{{1然后进行比较:1
为假。
编辑:我还想赞扬dtb现在撤回的评论,在问题结束时发布。我认为他说同样的话,但由于评论的长度限制,他无法完全表达出来。
答案 1 :(得分:4)
评估顺序。 ++首先评估(第二个例子)。但在第一个例子中,==先执行。