字典foreach KeyValuePair之谜

时间:2014-03-30 16:44:14

标签: c#

拿一小段代码

        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的输出和第二个,分别是:NWN2GameArea和string。所以任何理智的正常人都会认为foreach循环会起作用......但是

System.InvalidCastException:指定的强制转换无效。

为什么会这样....所以我尝试了其他一些东西,想知道键和值的类型,我得到了KeyCollection和ValueCollection。然而,当我想要转换为那些类型......编译器只是声明,嘿伙计这些类型不存在.... aaargh ...这种语言正在沮丧地进行练习......我应该坚持使用java。

任何人都能解释一下这种行为吗?

1 个答案:

答案 0 :(得分:1)

DictionaryBase是非泛型类型,枚举器返回的对的类型为DictionaryEntry,而不是您尝试在foreach循环中强制转换的通用KeyValuePair<string, NWN2GameArea>类型。< / p>

您可以更改foreach循环:

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

或者您可以继承一个通用集合。