2010-12-07 4 views
3

Je suis en train de passer outre Equals afin qu'il compare basé sur une variable ID:prioritaire opérateur =

public class OrderID 
{ 
    public string ID { get; private set; } 

    public OrderID(string id) 
    { 
     ID = id; 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj is OrderID) 
     { 
      return ((OrderID)obj).ID == ID; 
     } 
     else return false; 
    } 

    public override string ToString() 
    { 
     return ID; 
    } 
} 

Cependant, lorsque je teste ce de la manière suivante il retourne faux:

static void Main(string[] args) 
{ 

    OrderID i1 = new OrderID("Hello"); 
    OrderID i2 = new OrderID("Hello"); 

    bool test = i1 == i2; 

    Console.WriteLine(test.ToString()); 
    Console.ReadKey(); 
} 

Qu'est-ce que c'est le problème? Lorsque j'essaie de passer à travers, mon override n'est même pas entré.

+0

utilise l'opérateur == la même chose que d'appeler i1.Equals (i2); J'aurais dit non mais vous apprenez quelque chose de nouveau tous les jours ... – Rob

+1

@Rob ils ne sont pas les mêmes, c'est le problème. :) –

Répondre

2

operator == ne fera que par défaut vous dire si les deux i1 et i2 pointent vers le même objet (qu'ils ne le font pas). operator == peut être remplacé mais il est uniquement recommandé pour les types immuables.

Qu'est-ce que vous voulez est:

bool test = i1.Equals(i2); 

Et utiliser .Equals ID non operator == ID

if (obj is OrderID) 
{ 
    return ((OrderID)obj).ID.Equals(ID); 
} 

Pour vérifier l'utilisation de l'égalité de référence ReferenceEquals. Pour vérifier l'égalité de valeur, utilisez Equals

0

Comme mentionné l'utilisation i1.Equals(i2) pour comparer - En outre rappeler également que vous devez remplacer GetHashCode() lors de la substitution Equals, sinon votre classe peut ne pas fonctionner comme prévu.