Почему Dictionary.ContainsKey выбрасывает ArgumentNullException?

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

2 ответа

Решение

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

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

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 мог бы ответить на это. Но ИМО, так как добавление null значение ключа не допускается, нет смысла проверять null ключ в ContainsKey

Другие вопросы по тегам