Статический оператор == не обнаруживать переоцененный метод - PullRequest
1 голос
/ 05 декабря 2010

У меня есть базовый класс Class1 и производный класс2. Я создаю два экземпляра 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 голосов
/ 05 декабря 2010

По моему мнению, вообще не рекомендуется перегружать операторы == и! =, Так как по умолчанию семантика со ссылочными типами заключается в сравнении ссылок, а не значений. Я бы предпочел переопределить bool Equals (System.Object) и int GetHashCode () и использовать Equals для сравнения значений - IMHO делает код более читабельным благодаря уменьшению неоднозначности.

0 голосов
/ 05 декабря 2010

Добавьте перегрузки вашего оператора ко всем классам, в вашем примере добавьте его также к Class1, чтобы заставить его работать

...