# V3224. Consider using an overload with 'IEqualityComparer', as it is present in similar cases for the same collection element type.

Анализатор указывает на вызов метода или конструктора, в который не передаётся аргумент, реализующий интерфейс `IEqualityComparer<T>`. Возможно, этот аргумент был пропущен по ошибке. На это указывает наличие других методов или конструкторов, обрабатывающих коллекции с элементами того же типа, в которые передаётся аргумент с типом `IEqualityComparer<T>`.

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

    class CustomObjectComparer : IEqualityComparer<CustomObject> {}

    static CustomObjectComparer _comparer = new();

    HashSet<CustomObject> _hashSet = new(_comparer);
    Dictionary<CustomObject, int> _dictionary = new(_comparer);
    List<CustomObject> _list = new();

    void ExampleFoo(CustomObject obj)
    {
        ....
        if (_list.Contains(obj))  // <=
        ....
    }

В данном примере при инициализации коллекций `_hashSet` и `_dictionary` используется `_comparer` в качестве аргумента конструктора, который задаёт специфичную логику сравнения элементов этих коллекций.

Кроме того, в коде есть ещё одна коллекция — `_list`, при инициализации которой `_comparer` не может быть передан, так как в конструкторе нет соответствующего параметра.

Однако в методе `ExampleFoo` есть вызов `list.Contains`. Этот вызов может принимать на вход аргумент, реализующий интерфейс `IEqualityComparer<CustomObject>`, но в данном случае он отсутствует.

Т. к. в прочих случаях для переопределения логики сравнения элементов того же типа использовался `_comparer`, отсутствие этого аргумента в этом вызове выглядит подозрительно. Возможно, здесь допущена ошибка, из-за которой проверка на наличие элемента в `_list` будет выполняться некорректно.

Исправленный код в этом случае может выглядеть так:

    void ExampleFoo(CustomObject obj)
    {
        ....
        if (_list.Contains(obj, _comparer))
        ....
    }

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

CWE-685