2010-12-05 2 views
1

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

+0

Вы пытаетесь сделать основанный на значении компаратор, поскольку C# prvoide standard reference == автоматически. – rerun 2010-12-05 17:02:03

+1

Вы имеете в виду `overloaded` или` overridden`? Завышенный означает что-то другое. Какую ошибку вы получаете? – Oded 2010-12-05 17:02:23

+0

насколько я понимаю, статические методы перегружены и не переопределены. Возможно, я ожидаю переопределенный результат: S. Я не пытаюсь это сделать, но я полагаю, что ошибка заливки – Crandel 2010-12-05 17:29:35

ответ

0

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

0

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

Смежные вопросы