2016-04-24 1 views
3

J'ai donc une interface, appelons ça IInterface. Puis j'essaye d'implémenter l'interface dans l'implémentation. Ensuite, j'essaie de mettre en œuvre l'interface.Test de l'égalité des valeurs entre deux instances d'interface dans C#?

public bool Equals(IInterface other) 
    { 
     if (other == null) return false; 

     return (this.Name.Equals(other.Name) && this.Number.Equals(other.Number)); 
    } 

    public override int GetHashCode() 
    { 
     return this.Number.GetHashCode(); 
    } 

    public override bool Equals(object obj) 
    { 
     var other = obj as IInterface ; 
     return other != null && Equals(other); 
    } 

    public static bool operator ==(Implementation left, IInterface right) 
    { 
     if (ReferenceEquals(left, right)) return true; 

     if (ReferenceEquals(left, null)) return false; 

     return left.Equals(right); 
    } 

    public static bool operator !=(Implementation left, IInterface right) 
    { 
     return !(left == right); 
    } 

Le problème que je courais en est dans un setter:

public IInterface MyIntf 
    { 
     get { return _myIntf; } 
     set 
     { 
      if (_myIntf == value) { return; } 
      _myIntf = value; 
     } 

IntelliSense montre que le test d'égalité, il teste les références seulement et traiter à la fois gauche et à droite comme des objets. Je suppose que c'est parce qu'il n'y a pas de surcharge de l'opérateur pour == (IInterface à gauche, IInterface à droite). Bien sûr, je ne peux pas vraiment implémenter cette fonction parce que == nécessite que l'un des côtés corresponde au type de la classe d'implémentation. Comment s'assure-t-on correctement que deux interfaces peuvent être vérifiées pour l'égalité les unes par rapport aux autres?

Mise à jour

obtenu, vous ne pouvez pas implémenter == pour une interface. J'utiliserai Equals. Merci tout le monde.

Répondre

3

Vous devez appeler explicitement Equals:

if (_myIntf != null && _myIntf.Equals(value)) { return; } 

La mise en œuvre IEquatable<T> n'a pas d'impact de l'opérateur ==.

+0

Est-il possible d'implémenter une surcharge == opérateur pour une interface? – bodangly

+0

Un chemin plus court avec l'opérateur de propagation nulle: '_myIntf? .Equals (value) ?? false –

+0

@bodangly Non, vous ne pouvez pas. Voir cette question: http://stackoverflow.com/questions/5066281/can-i-overload-an-operator-on-an-interface –

3

Utilisation Equals au lieu de ==:

public IInterface MyIntf 
{ 
    get { return _myIntf; } 
    set 
    { 
     if (_myIntf.Equals(value)) { return; } 
     _myIntf = value; 
    } 
} 
+0

Vous devez utiliser l'opérateur de propagation null dans le cas où '_myIntf' est nul:' _myIntf? .Equals (value) ?? false' –

+0

@Fabien Donc, si je ne veux autoriser nulle part nulle part, pourrais-je utiliser l'opérateur de propagation null pour remplacer null par un modèle NullObject? – bodangly

+0

@bodangly Je viens de signaler que si '_myIntf' est nul, il peut se terminer par une exception NullReferenceException. –