Programming Languages Hacks

Importanti regole per linguaggi di programmazione rilevanti come Java, C, C++, C#…

  • Subscribe

  • Lettori

    I miei lettori abituali

  • Twitter

Polimorfismo dell’operatore == in C#

Posted by Ricibald on June 3rd, 2008

Mi sono battuto in C# in un problema non di poco conto:

L’operatore == non è polimorfico

Questo significa che prende solo l’implementazione del tipo specifico (a differenza del C++, in cui l’operatore è polimorfico poiché non statico). Se quindi confrontiamo due istanze di tipo Object allora l’implementazione sarà quella di base fornita in Object. Se confrontiamo due istanze di tipo String allora l’implementazione sarà il confronto alfanumerico. Ma se eseguiamo il downcast verso Object di due String allora il confronto sarà solo tra puntatori, non tra contenuto.

Quindi l’invocazione dell’operatore non è polimorfica. Ma questo non significa che lo deve essere anche la relativa implementazione. Esiste infatti un workaround per simulare il polimorfismo negli operatori, implementando qualcosa come:

abstract class Base
{
    public static bool operator==(Base b1, Base b2)
    {
        if( object.ReferenceEquals( b1, b2 ) )
        {
            return true;
        }
        else if( object.ReferenceEquals( b1, null ) || 
                 object.ReferenceEquals( b2, null ) )
        {
            return false;
        }
        return b1.Equals(b2);
    }
}

Quindi eventuali classi che derivano da Base saranno sicure che la seguente invocazione darà comunque luogo a un’esecuzione corretta:

// Classe Derived estende Base
Derived d1 = new Derived();
Derived d2 = new Derived();
Base b1 = d1;
Base b2 = d2;
Object o1 = d1;
Object o2 = d2;

di == d2;       // polimorfico     (esegue Equals)
b1 == b2;       // polimorfico     (esegue Equals)
o1 == o2;       // non polimorfico (esegue ReferenceEquals)

Questo wokaround si basa sul fatto che, a differenza degli operatori, il metodo Equals è polimorfico.

Una trattazione ufficiale Microsoft sull’operatore == e sul metodo Equals è riportata qui.

Leave a Reply

You must be logged in to post a comment.