2011-09-11 32 views
0

外I次のシナリオがあります。C#のオーバーロード演算子==クラス

public class SomeClass { 
     // Have some other data members as well 
     public int i ; 
    } 

    public class TestClass { 

     public bool SomeFunction() { 
      SomeClass a = new SomeClass(); 
      SomeClass b = new SomeClass(); 
      if (a == b) // this is where I am getting compile error 
       return true; 
      return false; 
     } 

     public static bool operator==(SomeClass a, SomeClass b) { 
      if (a.i == b.i) 
       return true; 
      // compare some other members as well 
      return false; 
     } 
    } 

は、C#で達成することが、このことは可能ですか?

ありがとうございました!

+0

なぜあなたはクラスを外したいですか? –

+0

実際のコードでは、クラス "SomeClass"の上の例では、他の誰かであり、私はそれを検証しようとしています – test123

答えて

1

いいえ、それは操作に関与していないクラスからオペレータを上書きすることはできません。


あなたは辞書で、たとえば、代わりにいくつかのケースでは、標準的な比較を使用することができますIEualityComparer<SomeClass>を実装するクラス、作ることができます:あなただけしたい場合は

var x = new Dictionary<SomeClass, string>(new SomeClassEqualityComparer()); 

を独自のクラスで比較を使用すると、演算子をオーバーライドする代わりに通常の静的メソッドにすることができます。

public static bool SomeClassEqual(SomeClass a, SomeClass b) { 
    if (a.i == b.i) { 
    return true; 
    } 
    // compare some other members as well 
    return false; 
} 

用途:

if (SomeClassEqual(a, b)) 
+0

答えをありがとう。それが私が知りたかったものです。だから私は比較を行うために愚かな関数を書く必要があると思う。ね – test123

+1

私はあなたが '' IEquatable 'ではなく[' IEqualityComparer '](http://msdn.microsoft.com/en-us/library/ms132151.aspx)を意味すると思います。前者は特定の型の2つのオブジェクトを比較するのに使用でき、後者は特定の型の他のオブジェクトを 'IEquatable 'を実装するオブジェクトと比較するために使用されます。言い換えれば、平等比較者は平等試験の当事者ではなく、同等である。 – cdhowie

+0

@cdhowie:はい、そうです。 – Guffa

1

voidメソッドでは、最初にreturn true;を使用することはできません。

第2に、オーバーライド演算子をホストクラスに適用する必要があります。あなたの場合はTestClassではなく、SomeClassの内部にあります。

第3に、==をオーバーライドする演算子を実装するときは、!=も実装する必要があります。ここで

はあなたのコードが改訂され、作業、次のとおりです。

public class SomeClass 
{ 
    // Have some other data members as well 
    public int i; 

    public static bool operator ==(SomeClass a, SomeClass b) 
    { 
     if (a.i == b.i) 
      return true; 
     // compare some other members as well 
     return false; 
    } 

    public static bool operator !=(SomeClass a, SomeClass b) 
    { 
     return !(a == b); 
    } 
} 

public class TestClass 
{ 

    public bool SomeFunction() 
    { 
     SomeClass a = new SomeClass(); 
     SomeClass b = new SomeClass(); 
     if (a == b) // this is where I am getting compile error 
      return true; 

     return false; 
    } 
} 
+1

申し訳ありません。これは単なるサンプルコードです。私はそれを修正します。ありがとう! – test123

+0

ホストクラス外の演算子をオーバーライドすることが可能であることを確認したいと思いますか? – test123

+0

更新されたコードをありがとう。実際には、これらのメソッドを実際のクラスの中に置くことはうまくいくと私は知っています。実際に私の質問は、ホストクラスの外でオーバーライドしようとするとうまくいくかどうかということでした。しかし、私はそれが@Guffaによって答えることはできないと思います。とにかく返信いただきありがとうございます。 – test123

関連する問題