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.
Kann eine Übersteuerung == für eine Schnittstelle implementiert werden? – bodangly
Ein kürzerer Weg mit dem Null-Propagation-Operator: '_myIntf? .Equals (Wert) ?? false' –
@bodangly Nein, du kannst nicht. Siehe diese Frage: http://stackoverflow.com/questions/5066281/can-i-overload-an-operator-on-an-interface –