2016-04-24 3 views
3

Also ich habe eine Schnittstelle, nennen wir es IInterface.Testen auf Wertegleichheit zwischen zwei Schnittstelleninstanzen in C#?

public interface IInterface : IEquatable<IInterface> 
{ 
    string Name { get; set; } 
    int Number { get; } 
    Task<bool> Update(); 
} 

Dann versuche ich und implementieren Sie die Schnittstelle in der Implementierung.

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

Das Problem, das ich in laufen lasse ist in einem Einrichter:

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

Intellisense zeigt, dass der Gleichheitstest gibt die Referenzen nur testet und links und rechts als Objekte zu behandeln. Ich nehme an, das liegt daran, dass es keine Operatorüberladung für == gibt (IInterface left, IIinterface right). Natürlich kann ich diese Funktion nicht wirklich implementieren, weil == erfordert, dass eine der Seiten dem Typ der implementierenden Klasse entspricht. Wie stellt man sicher, dass zwei Schnittstellen auf Gleichheit überprüft werden können?

aktualisieren

Verstanden, Sie nicht == für eine Schnittstelle implementieren kann. Ich werde Equals verwenden. Danke an alle.

Antwort

3

Sie explizit Equals nennen sollte.

+0

Kann eine Übersteuerung == für eine Schnittstelle implementiert werden? – bodangly

+0

Ein kürzerer Weg mit dem Null-Propagation-Operator: '_myIntf? .Equals (Wert) ?? false' –

+0

@bodangly Nein, du kannst nicht. Siehe diese Frage: http://stackoverflow.com/questions/5066281/can-i-overload-an-operator-on-an-interface –

3

Verwenden Equals statt ==:

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

Implementierung IEquatable<T> hat keine Auswirkungen auf den == Betreiber:

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

Sie sollten den Null-Propagierungsoperator verwenden, wenn '_myIntf' null ist:' _myIntf? .Equals (value) ?? false " –

+0

@Fabien Also, wenn ich nirgendwo null zulassen möchte, könnte ich den null-Propagation-Operator verwenden, um null durch ein NullObject-Muster zu ersetzen? – bodangly

+0

@bodangly Ich habe darauf hingewiesen, dass, wenn '_myIntf' null ist, es in einer NullReferenceException enden kann. –

Verwandte Themen