Фредрик прав ; вам нужно использовать Equals
, поскольку вы не можете предположить, что сможете использовать ==
для всех типов, поскольку оператор не определен для каждого типа.
В зависимости от вашего сценария, возможно, имеет смысл добавить
where TValue : IEquatable<TValue>
как ограничение общего типа для вашего класса. Причина этого в том, что object.Equals
принимает другой object
в качестве параметра, что означает, что если TValue
является типом значения, он будет помещен в коробку. Если известно, что, с другой стороны, можно реализовать IEquatable<TValue>
, тогда Equals
может быть преобразован в IEquatable<TValue>.Equals
*, который принимает TValue
в качестве параметра и, следовательно, не требует упаковывания типов значений.
Я мог бы также рекомендовать вам переосмыслить внутреннюю структуру этого класса. В настоящее время этот класс вообще не нужен, так как вы можете легко добавить метод расширения к IDictionary<TKey, TValue>
, чтобы найти ключ по значению с помощью перечисления значений. Вместо этого я бы сохранил два словаря: Dictionary<TKey, TValue>
и Dictionary<TValue, TKey>
, чтобы в O (1) был возможен двусторонний поиск.
* Кстати, если вам интересно, причина, по которой вы не можете использовать IEquatable<T>
(или какой-либо другой интерфейс в этом отношении), чтобы убедиться, что тип реализовал оператор ==
, заключается в том, что операторы статические , и интерфейсы не могут предоставлять статические методы (и, следовательно, не могут предоставлять операторы).