我有一段看似简单的代码,一直在抛出我不希望出现的错误:
// Private member
private Dictionary<InputField, bool> m_Completed;
// Later on, during some method
foreach (InputField filter in this.m_Completed.Keys)
if (this.m_Completed[filter])
completedCount += 1;
我得到的错误:
KeyNotFoundException: The given key was not present in the dictionary
这来自循环中的“if”语句。
对我来说,这意味着迭代器已经与dict的实际键失去同步。这可能吗?没有线程在进行。
我的工作流程错了吗?我可以想一些其他方法来计算,但我仍然想知道为什么我的代码会抛出错误。
答案 0 :(得分:1)
InputField
或其中一个基类以某种方式实现GetHashCode
,使得它不会在实例的生命周期内返回相同的值。
这完全打破了Dictionary
或HashSet
的功能,它依赖于一致的哈希码。
因此,一种可能的解决方案是让您的InputField
覆盖GetHashCode
和Equals
。如果它已经覆盖了这些,那么您需要修复实现。
您将在Eric Lippert的博客文章Guidelines and rules for GetHashCode中找到很好的指南,以证明其正确实施。
在这种情况下,这是当前实施中似乎缺少的准则:
指南:GetHashCode返回的整数永远不会改变
理想情况下,可变对象的哈希码应仅从不能变异的字段计算,因此对象的哈希值在其整个生命周期内都是相同的。