2010-12-05 1 views
1

私はベースクラスClass1と派生クラス2を持っています。私はclass2の2つのインスタンスを作成しますが、class1として定義します。 私の問題は、私はこのオブジェクト間の一般的な比較を行うことはできません。ここで は、たとえば、次のとおりですためスタティック演算子==オーバーレイされたメソッドを検出しない

if (obj1 == obj2) 

::私はラインを変更した場合

public class Class1 
    { 
     public int Property1 = 0; 
    } 

    public class Class2 : Class1 
    { 
     public int Property2 = 0; 

     public static bool operator ==(Class2 c1, Class2 c2) 
     { 
      return c1.Property2 == c2.Property2; 
     } 

     public static bool operator !=(Class2 c1, Class2 c2) 
     { 
      return c1.Property2 != c2.Property2; 
     } 
    } 

    public class Class3 : Class1 
    { 
     public int Property3 = 0; 
    } 

    static void Main(string[] args) 
    { 
     Class1 obj1 = new Class2(); 
     Class1 obj2 = new Class2(); 

     if (obj1 == obj2) 
     { 
      Console.WriteLine("Yes !!! The two objects are equal!"); 
     } 
     else 
     { 
      Console.WriteLine("The two objects are not equal."); 
     } 
    } 

if ((Class2)obj1 == (Class2)obj2) 

すべては右ですが、OBJ1場合とClass3にはobj2があり、私はエラーを取得する

どうすれば解決できますか?

はあなたに

Crandel

+0

c#prvoide標準参照==自動的に値比較演算子を実行しようとしていますか? – rerun

+1

'overloaded'または' overridden'を意味しますか?過大評価とは何かを意味します。あなたはどんなエラーを出していますか? – Oded

+0

私は静的メソッドがオーバーロードされていてオーバーライドされていないことを理解しています。たぶん、私はオーバーライドされた結果を期待します。私は実際にそれを試していないが、キャストエラーと思われる – Crandel

答えて

0

それは悪い考えである、それは私の意見では

+0

私は、すべての派生クラスで演算子を定義して、自分のプロパティを比較できます。 Class2はProperty1とProperty2を比較できます。 Class3はProperty1とProperty3を比較できます。 でも基本クラスでそれを行う必要があります – Crandel

0

を動作させるために、同様Class1に追加あなたの例では、すべてのクラスにあなたのオペレータのオーバーロードを追加します。ありがとうございました==演算子と!=演算子をオーバーロードするのは、参照型のデフォルトのセマンティックは値ではなく参照を比較するためです。私はむしろbool Equals(System.Object)とint GetHashCode()をオーバーライドして、値の比較にEqualsを使用します.IMHOを使うと、あいまいさを減らしてコードを読みやすくします。

+0

私は知っていますが、参照型を比較したくありません。時には同じオブジェクトのインスタンスが2つあり、同じかどうかを検出する必要があります。 – Crandel

+1

[MSDN](http://msdn.microsoft.com/en-us/library/ms173147.aspx)では、「型が不変の場合、インスタンスに含まれるデータを変更できないため、演算子のオーバーロード=== '不変型のオブジェクトでは、同じ値を持つ限り同じものとみなすことができるので、参照平等の代わりに値の等価性を比較すると便利です。 –

+0

私はおそらく私の問題は、オブジェクトがすでに存在するかどうかを検出する代わりに、2番目のオブジェクトを作成するときに同意します。 – Crandel