2009-04-09 17 views
5

L'output del codice sotto è come segue:== operatore sovraccarico quando oggetto è inscatolato

diverso
uguale

Nota la differenza di tipo di xe xx e che = = il sovraccarico dell'operatore viene eseguito solo nel secondo caso e non nel primo.

Esiste un modo per sovraccaricare l'operatore == in modo che il suo sia sempre eseguito quando viene eseguito un confronto tra istanze MyDataObejct.

Modifica 1: # qui voglio eseguire l'override dell'operatore == su MyDataClass, non sono sicuro di come posso farlo in modo che case1 esegua anche l'implementazione == sovraccarico.

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

risposta

5

No, in pratica. == utilizza l'analisi statica, quindi utilizzerà l'oggetto ==. Sembra che tu debba usare object.Equals(x,y) invece (o x.Equals(y) se sai che nessuno dei due è nullo), che usa il polimorfismo.

+1

Come punto di interesse, qual è il motivo per cui gli operatori non devono essere polimorfici? Mi sembra che il polimorfismo sarebbe più intuitivo. – Welbog

+0

ma quale vincerebbe? in a == b, quale metodo viene chiamato? specialmente se a/b sono sottotipi diversi ... –

+1

Inoltre, il polimorfismo renderebbe più difficile l'utilizzo di null negli operatori. –

1

Ecco una descrizione su come ignorare Equals e l'operatore ==:

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

Questo è come appare (a condizione che si è già fatto un sovraccarico di 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

Il test di 'b' per' null' in 'operator ==' non è necessario: questo è già fatto in 'Equals'. Puoi solo (implicitamente) delegare il test. Inoltre, perché mescoli 'object.ReferenceEquals (x, y)' con '(oggetto) x == (oggetto) y'? Rimani coerente. –

Problemi correlati