如何在C ++ / CLI应用程序中修复警告CA2226?

时间:2011-01-03 23:41:05

标签: c++-cli fxcop

我有一个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文档清楚地表明这是一个重要警告,不应该被禁止 - 但我还能做什么?

我正在寻找一种方法(如果可能的话)来“修复”代码,以便删除此警告。这可能吗,还是我只需要压制它?

2 个答案:

答案 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); }