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))
    ....    
}

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