C# 什么会导致dictionary.ContainsKey(dictionary.Keys.First())返回false?

C# 什么会导致dictionary.ContainsKey(dictionary.Keys.First())返回false?,c#,dictionary,equals,gethashcode,C#,Dictionary,Equals,Gethashcode,dictionary.Keys.First().GetHashCode()==dictionary.Keys.First().GetHashCode()返回true dictionary.Keys.First()==dictionary.Keys.First()返回true 少了什么?为什么字典找不到这个对象 字典类型:字典 下面是ExceptionWrapper.Equals和ExceptionWrapper.GetHashCode的实现: public override int GetHas

dictionary.Keys.First().GetHashCode()==dictionary.Keys.First().GetHashCode()返回true
dictionary.Keys.First()==dictionary.Keys.First()
返回true

少了什么?为什么字典找不到这个对象

字典类型:
字典

下面是
ExceptionWrapper.Equals
ExceptionWrapper.GetHashCode
的实现:

public override int GetHashCode() {
  return (typeof(TException).FullName + exception.Message + exception.StackTrace).GetHashCode();
}

public override bool Equals(object obj) {
  return 
    obj is ExceptionWrapper<TException>
&& (obj as ExceptionWrapper<TException>).GetHashCode() == GetHashCode();
}
public override int GetHashCode(){
return(typeof(TException).FullName+exception.Message+exception.StackTrace.GetHashCode();
}
公共覆盖布尔等于(对象对象对象){
返回
obj是例外包装器
&&(obj作为ExceptionWrapper).GetHashCode()==GetHashCode();
}

当键有一个哈希代码时,它首先被添加到
字典中。在此之后,对象被“变异”以给出一个状态,其中哈希代码是某个新的数字

因此,
词典
处于无效状态


不要对可能是某个哈希表中某个键的对象进行变异,以改变该对象的哈希代码。

字典的类型是什么?代码片段可能也会有帮助。是否从不同的线程访问
字典
?钥匙类型是什么?它是否覆盖了与
GetHashCode
的定义不一致的
Equals
?没有多线程。从串联的
字符串创建哈希不是一种好的样式。你的
等于
也是非常错误的;如果两个哈希值意外相等,则返回
true
。这些只是评论,不是你问题的答案。谢谢你对equals的反馈。是的,很邋遢。我想说我以前很匆忙,但这不是真正的借口。我不认为有任何变异发生。我将尝试将哈希代码存储在内存中,看看它是否确实解决了这个问题。谢谢你的想法。如果是因为状态突变,为什么dictionary.containsKey(dictionary.Keys.First())
不返回true?这似乎是最有可能的怀疑。。。ContainsKey仅检查对象中的哈希代码桶。。。因此,如果哈希代码更改,它现在正在为对象查找错误的bucket。@MushinNoShin,因为当哈希代码更改时,
字典
已完全损坏。钥匙丢了。搜索键只在一个“bucket”中进行,该“bucket”对应于新的散列,但由于该项位于另一个bucket中,因此未找到任何内容。@mushinoshin如果在
catch
块中处理的异常稍后在该块中用
throw
语句重试,该重试将修改异常的堆栈跟踪。