2011-01-03 2 views
0

저는 Equality 테스팅을 Reference보다 (String의 동작과 비슷한) Value 기반의 rahter로 만들려고하는 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; 
}; 
} 

하지만, 내 회사는 현재 모든 코드는 코드 분석 규칙을 준수하는 데 필요한 (그리고 당연히 그렇게) 요구된다. - 그러나 나는 다른 무엇을 할 수

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++ 인스턴스 연산자를 허용하지 않는다는 것이 이상하다는 것을 알았습니다. 나는 하나 또는 다른 하나가 인스턴스 연산자가 ref 클래스에서 허용되지 않는다고 불평 할 것을 기대한다. –

2

ref class의 경우 operator==(MyClass^ left, MyClass^ right)을 정적 멤버 함수로 구현해야하는데, 이것은 .NET 언어에서 찾을 수있는 정적 멤버 함수입니다.

현재 구현에서는 operator==(MyClass%, MyClass^ right)을 대신 지정합니다. 이는 일반적이지 않습니다.

left != nullptr을 신뢰할 수 없다는 것을 알아 두려면 ReferenceEquals(left, nullptr)을 테스트해야합니다.