.net 如何避免==重载中的堆栈溢出

.net 如何避免==重载中的堆栈溢出,.net,c#-3.0,equality,.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)

下面是我对==和!=的实现类中的运算符

 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?  

运算符定义中的
first==null
重新调用运算符=>stack overflow

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

替换你的

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

侧节点:上一个“else”主体不需要嵌套的“if”。它可以替换为
return first.FirstField==second.FirstField&&first.SecondField==second.SecondField

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