2011-01-03 3 views
0

Ich habe eine C++/CLI-Klassendefinition, in der ich versuche, Gleichheitsprüfung als wertebasiertes rahter als Referenz (ähnlich dem Verhalten von String) zu erhalten. Die folgenden Definitionen arbeiten:Wie kann ich die Warnung CA2226 in einer C++/CLI-Anwendung beheben?

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; 
}; 
} 

jedoch mein Unternehmen nun verlangt (und zu Recht), dass die gesamten Code der Code-Analyse-Regeln entsprechen muss. Codeanalyse berichtet konsequent zwei Warnungen auf der oben genannten Klasse:

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

Die Microsoft-Dokumentation auf Warnung CA2226 macht deutlich, dass dies eine wichtige Warnung und nicht unterdrückt werden sollte - aber was kann ich sonst noch tun?

Ich suche nach einem Weg (wenn möglich) den Code zu "reparieren", um diese Warnung zu entfernen. Ist das möglich, oder muss ich es nur unterdrücken?

Antwort

1

Dies ist ein .NET-Implementierungsdetail. Wenn die Überladung von Instanzoperatoren eine C++ - Funktion ist, erstickt der Codeanalysator darauf. Die .NET-Methode besteht darin, Operatorüberladungen als statische Funktionen zu verwenden. Bemerkenswert C# erfordert dies. Lösen Sie Ihr Problem ähnlich wie folgt:

static bool operator==(MyClass^ lhs, MyClass^ rhs) { return lhs->Equals(rhs); } 
    static bool operator!=(MyClass^ lhs, MyClass^ rhs) { return !lhs->Equals(rhs); } 
+0

Vielen Dank! Ich finde es seltsam, dass der Compiler und der Analysator beide die C++ - Instanzoperatoren zulassen, wenn C# dies nicht tut. Ich würde erwarten, dass der eine oder andere sich darüber beschwert, dass Instanzenbetreiber in Ref-Klassen nicht erlaubt sind. –

2

Für eine ref class, Sie sollen operator==(MyClass^ left, MyClass^ right) als statische Member-Funktion implementieren, dies ist die eine andere .NET-Sprachen finden.

Ihre aktuelle Implementierung definiert stattdessen operator==(MyClass%, MyClass^ right), was ungewöhnlich ist.

Beachten Sie, dass Sie sich nicht auf verlassen können, Sie müssen ReferenceEquals(left, nullptr) testen.

Verwandte Themen