На консоль ничего не попадёт: второй ключ не равен первому, поиск выбросит KeyNotFoundException, а пустой catch его скроет. Одного GetHashCode недостаточно.
Поведение Dictionary при использовании собственного типа ключа
На консоль ничего не попадёт: второй ключ не равен первому, поиск выбросит KeyNotFoundException, а пустой catch его скроет. Одного GetHashCode недостаточно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какое действие выполняет данная программа и какой вывод появится на консоли?
using static System.Console;
try
{
var dictionary = new Dictionary<Key, int>();
var firstKey = new Key(5);
dictionary[firstKey] = 42;
var secondKey = new Key(5);
WriteLine($"M0: {dictionary[secondKey]}");
}
catch { }
sealed class Key
{
public long InnerKey {get;}
public Key(long value)
{
InnerKey = value;
}
public override int GetHashCode()
=> HashCode.Combine(InnerKey);
}
Ответ
На консоль ничего не попадёт: второй ключ не равен первому, поиск выбросит KeyNotFoundException, а пустой catch его скроет. Одного GetHashCode недостаточно.
Оба объекта имеют одинаковый InnerKey и одинаковый хеш, но Key не переопределяет Equals. Для такого класса сравнение остаётся ссылочным, а firstKey и secondKey — разные экземпляры. Исключение возникает ещё при вычислении интерполированной строки, до WriteLine.
Нужно согласованно реализовать Equals и GetHashCode, например через IEquatable<Key>, либо использовать sealed record Key(long InnerKey);. Ключ должен оставаться неизменяемым, пока хранится в Dictionary. Одинаковый хеш определяет кандидатов на сравнение, но не доказывает равенство.