Ответ 1
Вам также необходимо переопределить GetHashCode()
(и предпочтительно также Equals()
). В противном случае объект возвращает другой хэш-код, а это означает, что ключ не найден при поиске.
Контракт GetHashCode()
указывает, что возвращаемое значение из двух объектов ДОЛЖНО быть равным, если два объекта считаются равными. Это корень вашей проблемы; ваш класс не отвечает этому требованию. Контракт не указывает, что значение должно быть иным, если оно не равно, но это улучшит производительность. (Если все объекты возвращают один и тот же хэш-код, вы также можете использовать плоский список с точки зрения производительности.)
Простая реализация в вашем случае может быть:
public override int GetHashCode()
{
return AValue.GetHashCode() ^ BValue.GetHashCode();
}
Обратите внимание, что было бы неплохо проверить, есть ли AValue
или BValue
null
. (Это будет несколько сложно, поскольку вы не ограничиваете общие типы A
и B
, поэтому вы не можете просто сравнивать значения с null
- например, типы могут быть типами значений.) 1
Также неплохо сделать классы, которые вы намерены использовать в качестве ключей словаря неизменяемыми. Если вы измените значение объекта, который используется в качестве ключа, словарь будет демонстрировать странное поведение, так как объект теперь находится в ведре, где он не принадлежит.
1 Обратите внимание, что вы можете использовать EqualityComparer<A>.Default.GetHashCode(AValue)
(и аналогичный для BValue
) здесь, так как это устранит необходимость нулевой проверки.