2011-01-03 10 views
0

私はEqualityテストがReferenceよりもValue Based Rahter(Stringの動作に似ている)になるようにしようとしているC++/CLIクラス定義を持っています。以下の定義は動作:C++/CLIアプリケーションで警告CA2226を修正するにはどうすればよいですか?

namespace MyCode 
{ 
public ref class MyClass 
{ 
public: 
    MyClass(); 
    bool operator==(MyClass^ obj) { return Equals(obj); } 
    bool operator!=(MyClass^ obj) { return !Equals(obj); } 
    virtual bool Equals(MyClass^ obj); 
    virtual bool Equals(System::Object^ obj) override; 
    virtual int GetHashCode() override; 
}; 
} 

しかし、私の会社は現在、すべてのコードは、コード分析規則に準拠する必要があること(そして当然のように)必要とされます。コード分​​析は、一貫して上記のクラスの2回の警告を報告します。

CA2226 : Microsoft.Usage : Since ''MyClass'' redefines operator '==', it should also redefine operator '!='. 
CA2226 : Microsoft.Usage : Since ''MyClass'' redefines operator '!=', it should also redefine operator '=='. 

警告CA2226上のMicrosoftのドキュメントは、それを明確に、これは重要な警告で、抑制されるべきではないということになります - しかし、私は他に何ができるのでしょうか?

私はこの警告を除去するために、コードを「修正」する(可能な場合)方法を探しています。それは可能ですか、それとも抑圧する必要がありますか?

答えて

1

これは.NET実装の詳細です。インスタンス演算子のオーバーロードを持つことはC++の機能であり、コードアナライザはそのコードを利用します。 .NETの方法は、演算子のオーバーロードを静的関数として持たせることです。特にC#はこれを必要とします。このような問題を解決してください:

+0

ありがとう!コンパイラとアナライザの両方がC++のインスタンス演算子を許可しているのは、C#がそうでないときには奇妙なことです。私はどちらか一方が、インスタンス演算子がrefクラスで許可されていないと不平を言うと期待します。 –

2

ref classの場合は、operator==(MyClass^ left, MyClass^ right)を静的メンバー関数として実装する必要があります。これは他の.NET言語で検出されるものです。

あなたの現在の実装では、特殊なケースですが、代わりにoperator==(MyClass%, MyClass^ right)を定義します。あなたはleft != nullptrに頼ることはできません

注意は、あなたがReferenceEquals(left, nullptr)をテストする必要があります。

関連する問題