2009-04-09 2 views
5

выходе ниже кода выглядит следующим образом:== Оператор перегрузки, когда объект в штучной упаковке

не равна
равна

Обратите внимание на разницу в типе х и хх и что = = перегрузка оператора выполняется только во втором случае, а не в первом.

Есть ли способ, которым я могу перегрузить оператор == так, чтобы его всегда выполнял при сравнении между экземплярами MyDataObejct.

Редактировать 1: # здесь я хочу переопределить оператор == на MyDataClass, я не уверен, как это сделать, чтобы case1 также выполнял перегруженную реализацию.

class Program { 
    static void Main(string[] args) { 
     // CASE 1 
     Object x = new MyDataClass(); 
     Object y = new MyDataClass(); 
     if (x == y) { 
      Console.WriteLine("equal"); 
     } else { 
      Console.WriteLine("not equal"); 
     } 

     // CASE 2 
     MyDataClass xx = new MyDataClass(); 
     MyDataClass yy = new MyDataClass(); 
     if (xx == yy) { 
      Console.WriteLine("equal"); 
     } else { 
      Console.WriteLine("not equal"); 
     } 
    } 
} 

public class MyDataClass { 
    private int x = 5; 

    public static bool operator ==(MyDataClass a, MyDataClass b) { 
     return a.x == b.x; 
    } 

    public static bool operator !=(MyDataClass a, MyDataClass b) { 
     return !(a == b); 
    } 
} 

ответ

5

Нет, в основном. == использует статический анализ, поэтому будет использовать объект ==. Похоже, вам нужно вместо этого использовать object.Equals(x,y) (или x.Equals(y), если вы знаете, что ни один из них не равен null), который использует полиморфизм.

+1

Как интересно, почему аргументы за отсутствие операторов являются полиморфными? Мне кажется, что полиморфизм будет более интуитивным. – Welbog

+0

, но который выиграет? в a == b, какой метод вызывается? особенно если a/b - разные подтипы ... –

+1

Также - полиморфизм затруднит использование нулей в операторах. –

1

Вот описание того, как переопределить Equals и оператор ==:

http://msdn.microsoft.com/en-us/library/ms173147(VS.80).aspx

Вот как это выглядит (при условии, что вы уже сделали перегрузки Equals()):

public static bool operator ==(MyDataClass a, MyDataClass b) 
{ 
    // If both are null, or both are same instance, return true. 
    if (System.Object.ReferenceEquals(a, b)) 
    { 
     return true; 
    } 

    // If one is null, but not both, return false. 
    if (((object)a == null) || ((object)b == null)) 
    { 
     return false; 
    } 

    // Otherwise use equals 
    return a.Equals(b); 
} 

public override bool Equals(System.Object obj) 
{ 
    // If parameter is null return false. 
    if (obj == null) 
    { 
     return false; 
    } 

    // If parameter cannot be cast to MyDataClass return false. 
    MyDataClass p = obj as MyDataClass; 
    if ((System.Object)p == null) 
    { 
     return false; 
    } 

    return (x == p.x); 
} 
+0

Тестирование 'b' для' null' в 'operator ==' не нужно: это уже сделано в 'Equals'. Вы можете просто (неявно) делегировать тест. Кроме того, почему вы смешиваете 'object.ReferenceEquals (x, y)' с '(object) x == (object) y'? Оставайтесь последовательными. –

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