Почему Dictionary.ContainsKey вызывает ArgumentNullException?

В документации указано, что bool Dictionary<TKey, TValue>.ContainsKey(TKey key) генерирует исключение в случае передачи пустого ключа. Может ли кто-нибудь объяснить причину этого? Не было бы более практичным, если бы он только что вернулся false?

Ответ 1

Если ContainsKey(null) возвращено false, это даст ложное впечатление, что пустые ключи разрешены.

Ответ 2

Вот как это реализовано: (Источник)

public bool ContainsKey(TKey key) {
    return FindEntry(key) >= 0;
}

И метод FindEntry как:

private int FindEntry(TKey key) {
    if( key == null) {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
    }

    if (buckets != null) {
        int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
        for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) {
            if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) return i;
        }
    }
    return -1;
}

Поскольку значение null в качестве ключа в словаре не разрешено.

Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add(null, 10);

Вышеизложенное создаст исключение:

Значение не может быть нулевым. Имя параметра: клавиша

По вашему вопросу:

Не было бы более практичным, если бы он просто вернул false?

Кто-то из Microsoft, вероятно, ответит на это. Но IMO, так как добавление значения null для ключа не допускается, нет смысла проверять ключ null в ContainsKey