如何避免==重载中的stackoverflow

时间:2014-07-15 15:55:33

标签: .net c#-3.0 equality

这是我在类中实现的==和!=运算符。

 public class MyClass 
    {
        public int         FirstField            { get; set; }
        public int         SecondField            { get; set; }

        public static bool operator ==(MyClass first, MyClass second)
        {
            if (first == null && second == null)
                return true;
            else if (first == null || second == null)
                return false;
            else
            {
                if (first.FirstField == second.FirstField && first.SecondField == second.SecondField)
                    return true;
                else
                    return false;
            }
        }

        public static bool operator !=(MyClass first, MyClass second)
        {
            return !(first == second);
        }
    }

否则代码中我有以下两个用于==和!=比较的实例。

MyClass class1;
MyClass class2;

if (class1 == null || (class1 != null && class1 != class2)  )

问题是当调用上面的行时,我在下一行得到一个stackoverflow异常。

if (first == null && second == null)

What am I doing wrong here?  

1 个答案:

答案 0 :(得分:3)

运营商定义中的first == null重新调用operator =>堆栈溢出。

您要检查的是引用相等,它与重载时的“==”不同。

替换

        if (first == null && second == null)
            return true;
        else if (first == null || second == null)
            return false;

通过

if (ReferenceEquals(first,second))
   return true;
if(ReferenceEquals(first,null) || ReferenceEquals(second,null))
   return false;

侧节点: 您的上一个“其他”正文并不需要嵌套的“if”。它可以替换为return first.FirstField == second.FirstField && first.SecondField == second.SecondField;