我的代码中有一个奇怪的错误......
代码:
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];
一切都变得正常,现在有错误。
答案 0 :(得分:2)
假设T
会覆盖Equals
和GetHashCode
* ,我唯一可以理解这种情况的方法是,如果你的密钥是 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。