静态运算符==未检测到高估方法

时间:2010-12-05 16:56:11

标签: c# inheritance operators equals

我有基类Class1和派生类class2。我创建了两个class2实例,但定义为class1。 我的问题是我不能在这些对象之间做一般的比较。 这是一个例子:

    public class Class1
    {
        public int Property1 = 0;
    }

    public class Class2 :  Class1
    {
        public int Property2 = 0;

        public static bool operator ==(Class2 c1, Class2 c2)
        {
            return c1.Property2 == c2.Property2;
        }

        public static bool operator !=(Class2 c1, Class2 c2)
        {
            return c1.Property2 != c2.Property2;
        }
    }

    public class Class3 :  Class1
    {
        public int Property3 = 0;
    }

    static void Main(string[] args)
    {
        Class1 obj1 = new Class2();
        Class1 obj2 = new Class2();

        if (obj1 == obj2)
        {
            Console.WriteLine("Yes !!! The two objects are equal!");
        }
        else
        {
            Console.WriteLine("The two objects are not equal.");
        }
    }

如果我换行:

if (obj1 == obj2)

有:

if ((Class2)obj1 == (Class2)obj2)

一切都是正确的,但如果obj1和obj2是Class3,我会收到错误

我该如何解决?

谢谢

Crandel

2 个答案:

答案 0 :(得分:0)

将运算符重载添加到所有类中,在您的示例中将其添加到Class1以使其工作

答案 1 :(得分:0)

在我看来,重载==和!=运算符是个坏主意,因为引用类型的默认语义是比较引用而不是值。我宁愿覆盖bool Equals(System.Object)和int GetHashCode()并使用Equals进行值比较 - 恕我直言通过减少歧义使代码更具可读性。