为什么Dictionary.ContainsKey抛出ArgumentNullException?

时间:2013-12-06 15:45:15

标签: c# .net exception idictionary

文档指出bool Dictionary<TKey, TValue>.ContainsKey(TKey key)在传递null键时抛出异常。谁能说出理由呢?如果它刚刚返回false会不会更实际?

2 个答案:

答案 0 :(得分:18)

如果ContainsKey(null)返回false,则会产生令人误解的印象,即允许使用空键。

答案 1 :(得分:6)

这是如何实施的: (Source)

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);

以上会产生例外情况:

  

值不能为空。参数名称:key

对于你的问题:

  

如果它只是返回虚假会不会更实际?

微软的某个人可能会回答这个问题。但是IMO,因为不允许为密钥添加null值,所以在null

中检查ContainsKey密钥是没有意义的