2009-04-09 17 views
5

Sygnał wyjściowy poniżej kodu jest następujący:== przeciążenia operatora, gdy obiekt jest zapakowane

nierówny
równa

zauważyć różnicę typu X i Xi oraz które = = Przeciążenie operatora jest wykonywane tylko w drugim przypadku, a nie w pierwszym.

Czy istnieje sposób, że mogę przeciążać operatora == tak, że jego zawsze jest wykonywany podczas porównywania między instancjami MyDataObejct.

Edytuj 1: # tutaj chcę zastąpić operatora == w MyDataClass, nie jestem pewien, jak mogę to zrobić, aby case1 również wykonał przeciążenie == implementacji.

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); 
    } 
} 

Odpowiedz

5

Nie, zasadniczo. == używa analizy statycznej, więc użyje obiektu ==. Wygląda na to, że musisz zamiast tego użyć object.Equals(x,y) (lub x.Equals(y), jeśli wiesz, że żadna z nich nie jest pusta), która używa polimorfizmu.

+1

Co jest powodem do zainteresowania się, dlaczego operatorzy nie są polimorficzni? Wydaje mi się, że polimorfizm byłby bardziej intuicyjny. – Welbog

+0

, ale który wygrałby? w a == b, jaka metoda jest wywoływana? szczególnie jeśli a/b są różnymi podtypami ... –

+1

Również - polimorfizm utrudniłby stosowanie zer w operatorach. –

1

Oto opis, w jaki sposób zastąpić Równa i operator ==:

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

Jak to wygląda (pod warunkiem, że masz już przeciążenie 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

Testowanie 'b' dla' null' w 'operator ==' jest niepotrzebne: jest to już zrobione w 'Equals'. Możesz po prostu (niejawnie) przekazać test. Poza tym, dlaczego miksujesz 'object.ReferenceEquals (x, y)' z '(object) x == (object) y'? Bądź konsekwentny. –

Powiązane problemy