# V3197. The compared value inside the 'Object.Equals' override is converted to a different type that does not contain the override.

Анализатор обнаружил возможную ошибку в переопределённом методе 'Equals', связанную с проверкой неверного типа.

Рассмотрим пример:

    private class FirstClass
    {
      ....
      public override bool Equals(object obj)
      {
        SecondClass other = obj as SecondClass;   // <=

        if (other == null)
        {
          return false;
        }
        return Equals(other);
      }
      public bool Equals(FirstClass other)
      {
        ....
      }
    }

В переопределённом методе 'Equals' класса 'FirstClass' допущена ошибка при проверке типа 'obj': вместо 'SecondClass' должен быть 'FirstClass'.

В результате ошибки, если в переопределённый метод 'Equals' будет передан объект типа 'FirstClass', метод будет всегда возвращать 'false'.

Более того, если передать в качестве параметра объект типа 'SecondClass', тогда будет вызван этот же переопределённый метод 'Equals'. Это приведёт к рекурсии и выбрасыванию исключения типа 'StackOverflowException'.

Исправленный вариант:

    private class FirstClass
    {
      ....
      public override bool Equals(object obj)
      {
        FirstClass other = obj as FirstClass;

        if (other == null)
        {
          return false;
        }
        return Equals(other);
      }
    }

Данная диагностика классифицируется как:

CWE-697

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3197.