Почему 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