我有一个C ++ / CLI类定义,我试图将Equality测试变为基于Value的rahter而不是Reference(类似于String的行为)。以下定义有效:
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文档清楚地表明这是一个重要警告,不应该被禁止 - 但我还能做什么?
我正在寻找一种方法(如果可能的话)来“修复”代码,以便删除此警告。这可能吗,还是我只需要压制它?
答案 0 :(得分:2)
对于ref class
,您应该将operator==(MyClass^ left, MyClass^ right)
实现为静态成员函数,这是其他.NET语言可以找到的。
您当前的实现定义了operator==(MyClass%, MyClass^ right)
,这是不寻常的。
请注意,您不能依赖left != nullptr
,需要测试ReferenceEquals(left, nullptr)
。
答案 1 :(得分:1)
这是一个.NET实现细节。具有实例运算符重载是C ++特性,代码分析器会对其进行扼流。 .NET方法是将操作符重载作为静态函数。值得注意的是C#需要这个。解决与此类似的问题:
static bool operator==(MyClass^ lhs, MyClass^ rhs) { return lhs->Equals(rhs); }
static bool operator!=(MyClass^ lhs, MyClass^ rhs) { return !lhs->Equals(rhs); }