2016-04-24 12 views
3

私はインターフェイスを持っているので、IInterfaceと呼ぶことができます。C#の2つのインターフェイスインスタンス間の値の等価性をテストしますか?

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

次に、実装でインターフェイスを実装しようとします。

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

私はに実行しています問題はセッターである:

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

インテリセンスが平等テストが参照のみをテストし、左と右のオブジェクトの両方を処理していることを示しています。これは、==(IInterface left、IInterface right)の演算子オーバーロードがないからです。もちろん、私は実際にその関数を実装することはできません。なぜなら、==は実装クラスの型に一致する辺の1つを必要とするからです。どのようにして、2つのインタフェースが互いに同等かどうかを正しく確認できるかどうかを正しく確認するにはどうすればよいですか?

アップデートでは、インターフェイスのために==を実装することはできません、それを手に入れました。私は等しいを使用します。みんな、ありがとう。

答えて

3

あなたが明示的にEqualsを呼び出す必要があります:

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

==オペレータに影響を与えないIEquatable<T>を実装します。

+0

インターフェイスに==演算子オーバーロードを実装することはできますか? – bodangly

+0

ヌル伝播演算子では、より短い方法です: '_myIntf?.Equals(value)??偽 " –

+0

@bodanglyいいえ、できません。この質問を参照してください:http://stackoverflow.com/questions/5066281/can-i-overover-an-operator-on-an-interface –

3

利用代わり==Equals

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

'_myIntf'がnullの場合、null伝播演算子を使用する必要があります:' _myIntf?.Equals(value)?? false' –

+0

@Fabienだからどこでもnullを許可しない場合、NullObjectパターンでnullを置き換えるためにnull伝播演算子を実際に使用できますか? – bodangly

+0

@bodangly私は '_myIntf'がnullの場合、NullReferenceExceptionで終わることができると指摘しました。 –