Ваш код должен без проблем работать в .NET, и я бы осмелился сказать, что он останется таковым, даже если версия .NET изменится. Дело в том, что словарь использует две вещи для доступа к значению по определенному ключу: Equals () и GetHashCode () следующим образом
- получить все ключи, которые соответствуют запрашиваемому значению ключа, по значению GetHashCode () (значение GetHashCode должно быть одинаковым для одинаковых объектов и должно отличаться для разных объектов)
- отфильтровать список, созданный на предыдущем шаге, используя Equals ().
Стандартные Equals () для типов значений используют отражение для доступа к полям и их сравнения (как упоминалось ранее). Принимая это во внимание, GetHashCode () по умолчанию должен быть совместим с тем, как работает реализация Equals () по умолчанию - если a == b, a.GetHashCode () == b.GetHashCode () - в любом случае не было бы смысла предоставлять реализация по умолчанию, если она даже не соответствует требуемому минимуму. MSDN говорит, что GetHashCode () не предоставляет уникальных значений, и это вполне понятно. Имейте в виду, что такая простая реализация:
public int GetHashCode()
{
return 0;
}
все еще корректен (словари, хеш-таблицы и т. Д. Будут работать), даже если значения не являются уникальными. Производительность, конечно, является другим вопросом, использование такой реализации приведет к полному сканированию каждой коллекции и проверке каждого элемента на равенство.