Поведение Dictionary при использовании собственного типа ключа

На консоль ничего не попадёт: второй ключ не равен первому, поиск выбросит KeyNotFoundException, а пустой catch его скроет. Одного GetHashCode недостаточно.

Короткий ответ

Что ответить на собеседовании

На консоль ничего не попадёт: второй ключ не равен первому, поиск выбросит 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. Одинаковый хеш определяет кандидатов на сравнение, но не доказывает равенство.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее