1

次のようなコードがあります。

変数がインターフェイス IMyClass のときに呼び出されるように、演算子 == をどのように実装すればよいですか?

public class MyClass : IMyClass
{
    public static bool operator ==(MyClass a, MyClass b)
    {
        if (ReferenceEquals(a, b))
            return true;

        if ((Object)a == null || (Object)b == null)
            return false;

        return false;
    }

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

class Program
{
    static void Main(string[] args)
    {
        IMyClass m1 = new MyClass();
        IMyClass m2 = new MyClass();

        MyClass m3 = new MyClass();
        MyClass m4 = new MyClass();

        Console.WriteLine(m1 == m2); // does not go into custom == function. why not?
        Console.WriteLine(m3 == m4); // DOES go into custom == function
    } 
}
4

3 に答える 3

6

重要なのは、演算子をオーバーライドしているのではなく、オーバーロードしていることです。

に対して定義された演算子はありません

operator ==(IMyClass x, IMyClass y)

そのため、コンパイラには呼び出すことができるものは何もありません。呼べない

operator ==(MyClass x, MyClass y)

それを認識せずm1m2実際には のインスタンスを参照するためですMyClass

私が知る限り、インターフェイスに使用する演算子を実装する方法はありません。結局のところ、複数の実装がすべて独自の実装を提供する可能性があります。

個人的には、封印されていない型との等価性について最初から話そうとすることにやや慎重です。等価性と継承はうまく混ざりません。もちろん、これはインターフェイスの場合は二重になります:)適切なを実装IEqualityComparer<IMyClass>し、代わりにそれを使用するのが最善かもしれません。

于 2010-06-15T11:49:26.650 に答える
0

この質問に対する受け入れられた回答を見てください: == vs. Object.Equals(object) in .NET

違いは、ID の同等性とセマンティックな同等性のいずれかです。== のオーバーライドは、構造体が値によってコピーされるため、同じオブジェクトへの参照ではないため、同じ値を持つため「同じ」と想定される構造体を対象としています。

Equals は、参照型の値が等しいかどうかのセマンティック チェックに使用されます。デフォルトでは、2 つの操作は同じです。

于 2010-06-15T12:23:11.407 に答える
-3

operator== 関数を仮想化してみてください。

于 2010-06-15T11:49:45.840 に答える