== vs C等于#

时间:2010-10-06 10:57:55

标签: c# .net operators equality

评估==和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

2 个答案:

答案 0 :(得分:12)

根据规范,这是预期的行为。

第一种行为受规范第7.3节的管辖:

  

表达式中的操作数从左到右进行计算。例如,在F(i) + G(i++) * H(i)中,使用旧值i调用方法F,然后使用旧值i调用方法G,最后,使用新值i调用方法H.这与运算符优先级分开,无关。

因此,在x==x++中,首先评估左操作数(0),然后评估右手(0x变为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,一个变量),然后评估参数(0x变为{{1然后进行比较:1为假。

编辑:我还想赞扬dtb现在撤回的评论,在问题结束时发布。我认为他说同样的话,但由于评论的长度限制,他无法完全表达出来。

答案 1 :(得分:4)

评估顺序。 ++首先评估(第二个例子)。但在第一个例子中,==先执行。