字典KeyNotFoundException即使Key存在

时间:2012-03-22 17:41:32

标签: c# .net registry

我有RegistryKey作为我字典的密钥。

我似乎无法为该特定键设置值。无论我做什么,我都会得到KeyNotFoundException。 Key确实存在,我之前创建了一行

e.g:

public Dictionary<RegistryKey, Dictionary<string, object>> subKeyNodes = new...
subKeyNodes.Add(mainKeyNode.CreateSubKey(keyName),new Dictionary<string, object>());
subKeyNodes[mainKeyNode.CreateSubKey(keyName)].Add("ROAR", "value");

添加工作正常。添加该键值总是失败,我似乎无法弄明白。

3 个答案:

答案 0 :(得分:4)

更好的方法是向Dictionary的构造函数提供实现IEqualityComparer<RegistryKey>的东西 - 这样,您就不需要包装每个对象。

答案 1 :(得分:2)

RegistryKey既没有GetHashCode也没有Equals覆盖。这意味着RegistryKey的实例将使用默认实现(在Object中定义)。因此,RegistryKey的两个实例即使其字段相同也不会被识别为“相等”。这意味着您不能将此类的实例用作基于散列的集合的键,例如DictionaryHashSet

作为一种变通方法,您可以定义另一个包装RegistryKey的类并定义这些方法覆盖。

答案 2 :(得分:1)

每次调用它时,

CreateSubKey可能会返回一个新的对象实例。因此,调用它两次将为您提供不同的对象(即使它们可能引用相同的注册表项)。您应该将第一次调用的结果存储到CreateSubKey,而不是再次调用它。或者使用键名而不是对象作为词典的键。