Dictionary中一个非常奇怪的System.Collections.Generic.KeyNotFoundException

时间:2015-10-15 14:13:01

标签: c# dictionary

我的代码中有一个奇怪的错误......

代码:

this

第一行

public class PropertyCollection<T> : IDictionary<T, string>
{
        private Dictionary<T, string> dict;
        ...
        public string this[T key]
        {
            get
            {
                bool has_key = this.Keys.Any(x => x == key); 
                return this.dict[key];
            }
            set
            {
                this.dict[key] = value;
            }
        }
        ...
}

返回bool has_key = this.Keys.Any(x => x == key);

但是

true

抛出错误:

  

System.Collections.ListDictionaryInternal.NodeKeyValueCollection:字典中没有给定的密钥。

这怎么可能?

如果我将行引发异常,则

return this.dict[key];

一切都变得正常,现在有错误。

1 个答案:

答案 0 :(得分:2)

假设T会覆盖EqualsGetHashCode * ,我唯一可以理解这种情况的方法是,如果你的密钥是 mutable ,它的GetHashCode方法使用可变字段,并且在中将密钥插入字典后调用了变异方法

这会使线性搜索this.Keys.Any(x => x == key)生成true,但基于散列的搜索会产生异常。

确认这一点非常简单:下面的代码应该打印false

var first = dict.Keys.First(x => x == key);
Console.WriteLine(first.GetHashCode() == key.GetHashCode());

* 如果T未覆盖这些方法中的一个或两个,see this Q&A