4

次の C++/CLI クラスがあります。

 public ref class MyClass
    {
    public:
        int val;
        bool operator==(MyClass^ other)
        {
            return this->val == other->val;
        }

        bool Equals(MyClass^ other)
        {
            return this == other;
        }
    };

の 2 つのインスタンスが等しいかどうかを C# から検証しようとするとMyClass、間違った結果が得られます。

MyClass a = new MyClass();
MyClass b = new MyClass();

//equal1 is false since the operator is not called
bool equal1 = a == b;
//equal2 is true since the comparison operator is called from within C++\CLI
bool equal2 = a.Equals(b);

私は間違って何をしていますか?

4

1 に答える 1

11

オーバー==ロードしている演算子は C# ではアクセスできず、行は参照によってbool equal1 = a == b比較abれます。

二項演算子は C# の静的メソッドによってオーバーライドされるため、代わりに次の演算子を提供する必要があります。

static bool operator==(MyClass^ a, MyClass^ b)
{
  return a->val == b->val;
}

オーバーライド==するときは、 もオーバーライドする必要があります!=。C# では、これは実際にはコンパイラによって強制されます。

于 2012-08-31T09:22:24.463 に答える