我先在编写一个类时需要重载==操作符以判断类的成员数据是否相等,但遇到了一个诡异的问题:当我在进行成员数据的判断之前,先需要判断该实例是否为null(因为如果为null,则会产生异常),而要判断该实例是否为null,又需要调用==操作符,这样就形成了无限递归而导致堆栈溢出异常。请问大家是如何处理这个问题的?代码如下:        public static bool operator ==(Hex h1,Hex h2)
        {
            if (h1 == null || h2 == null)  //此处导致无限递归而堆栈溢出
                return false;
            
            if (h1.getBytesCount() != h2.getBytesCount()) //如果不判断对象为null,此处就会产生异常
                return false;            byte[] b1 = h1.getBytes();
            byte[] b2 = h2.getBytes();
            for (int i = 0; i < b1.Length; i++)
            {
                if (b1[i] != b2[i])
                    return false;
            }
            return true;
        }

解决方案 »

  1.   

    不要在引用类型中重载==运算符!
    参考《Effective C#》原则9 Understand the Relationships Among ReferenceEquals(), static Equals(), instance Equals(), and operator==http://www.cnblogs.com/WuCountry/archive/2007/02/25/656433.html
      

  2.   

    可以用ReferenceEquals来判断。
    另外同意ls的,C#里不要重载==,用Equals方法。
      

  3.   

    二楼写的东西,看的晕了半天。
    三楼的说法是不对的,因为==操作符就是调用了Equals方法的(System.Object 但System.String的Equlas方法不同,它重载了Object的Equlas方法,不用去判断2对象的地址是否相同,而使用EqualsHelper方法),而Object.Equals里调用的是InternalEquals方法,用来查看查看内存地址是否相同。所以,==操作符是可以重载的(但同时也是有风险的)。
    不过最后,我还是帮不了你如何去重载==方法。。