# V3160. Argument of incorrect type is passed to the 'Enum.HasFlag' method.

Анализатор обнаружил, что тип объекта, вызывающего метод 'Enum.HasFlag', отличается от типа передаваемого аргумента. В результате такого вызова будет выброшено исключение типа 'ArgumentException'.

Рассмотрим синтетический пример:

    bool DoSomethingIfAttachedToParent(TaskContinuationOptions options)
    {
      if (options.HasFlag(TaskCreationOptions.AttachedToParent))
      {
        // ....
        return true;
      }
      else
      {
        return false;
      }
    }

Обратите внимание: в данном примере 'HasFlag' вызывается у объекта типа 'TaskContinuationOptions', а в качестве аргумента передаётся объект типа 'TaskCreationOptions'. Выполнение этого кода приведёт к выбрасыванию исключения типа 'ArgumentException'.

Заметить такую ошибку может быть непросто, так как названия перечислений схожи, а элемент 'AttachedToParent' присутствует в обоих типах.

Чтобы поправить данный фрагмент, необходимо поменять тип аргумента или вызывающего объекта:

    bool DoSomethingIfAttachedToParent(TaskContinuationOptions options)
    {
      if (options.HasFlag(TaskContinuationOptions.AttachedToParent))
      {
        // ....
        return true;
      }
      else
      {
        return false;
      }
    }

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

CWE-686