Как исправить предупреждение CA2226 в приложении C ++ / CLI? - PullRequest
0 голосов
/ 04 января 2011

У меня есть определение класса C ++ / CLI, в котором я пытаюсь сделать тестирование на равенство скорее основанным на значениях, чем ссылочным (аналогично поведению 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 '=='.

Документация Microsoft по предупреждению CA2226 ясно дает понять, что это важное предупреждение, и его не следует подавлять - но что еще я могу сделать?

Я ищу способ (если возможно) исправить код, чтобы убрать это предупреждение.Это возможно, или мне просто нужно подавить это?

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Для ref class вы должны реализовать operator==(MyClass^ left, MyClass^ right) как статическую функцию-член, это то, что найдут другие языки .NET.

Ваша текущая реализация определяет operator==(MyClass%, MyClass^ right)что необычно.

Обратите внимание, что вы не можете положиться на left != nullptr, вам нужно проверить ReferenceEquals(left, nullptr).

1 голос
/ 04 января 2011

Это деталь реализации .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); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...