字典查找每个KeyValuePair之谜

本文关键字:KeyValuePair 之谜 查找 字典 | 更新日期: 2023-09-27 17:54:58

取这一小段代码

        NWN2GameAreaDictionary areaDictionary = app.Module.Areas;
        IEnumerator enumerator = areaDictionary.Values.GetEnumerator();
        enumerator.MoveNext();
        MessageBox.Show(enumerator.Current.GetType().Name);
        enumerator = areaDictionary.Keys.GetEnumerator();
        enumerator.MoveNext();
        MessageBox.Show(enumerator.Current.GetType().Name);

        foreach (KeyValuePair<string, NWN2GameArea> entry in areaDictionary)
        {
            MessageBox.Show(entry.Key);
            MessageBox.Show(entry.Value.Name);
        }

NWN2GameAreaDictionary继承自IDictionary

public class NWN2GameAreaDictionary : OEIDictionaryWithEvents
public abstract class OEIDictionaryWithEvents : DictionaryBase
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable

当我运行该代码时,我得到第一个MessageBox和第二个MessageBox的输出,分别是:NWN2GameArea和string。所以任何一个正常的人都会认为foreach循环是有效的……然而,

系统。InvalidCastException:指定的类型转换无效。

为什么会是....我尝试了一些其他东西想知道键和值的类型我得到了KeyCollection和ValueCollection。然而,当我想转换到这些类型时……编译器只是说,嘿,伙计,这些类型不存在....了……这种语言正在变得令人沮丧……我还是用java吧。

谁能给我解释一下这种行为?

字典查找每个KeyValuePair之谜

DictionaryBase是非泛型类型,从枚举器返回的对类型为DictionaryEntry,而不是您试图在foreach循环中转换为的泛型KeyValuePair<string, NWN2GameArea>类型。

你可以改变你的foreach循环:

foreach (System.Collections.DictionaryEntry entry in areaDictionary)
{
    MessageBox.Show(entry.Key);
    MessageBox.Show(((NWN2GameArea)entry.Value).Name);
}

或者可以继承泛型集合