IEnumerable.GetEnumerator引发InvalidCastException->为什么我没有得到编译时错误?

问题描述 投票:0回答:1

我发现了一个非常令人困惑的问题,希望您能帮助我理解此问题。我的目标是要有一个结构,为了便于阅读,我可以轻松地对其进行迭代。不幸的是,我收到了InvalidCastException,我不明白为什么会这样。我相信编译器不应该能够编译它:

原文

我希望它能开箱即用,因为我在Reshaper的帮助下让接口在该结构的字段上实现,但是在运行单元测试(可能不是在生产环境中)时,我收到InvalidCastException尝试进行迭代我的领域。

正如我所说的,该问题是在迭代时发生的,这意味着GetEnumerator()方法将引发InvalidCastException。我要迭代使用什么作为底层对象?这是一个ConcurrentDictionary(请参见代码示例),我发现了有关IEnumerable接口的几个问题。

据我所知,该接口的实现并没有做错任何事情,至少在明显方面是明显的。

public struct test : IEnumerable<(int, string)>
{
        public ConcurrentDictionary<string,(int,string)> dictionary ;

        public IEnumerator<(int, string)> GetEnumerator()
        {
            return ((IEnumerable<(int,string)>)dictionary).GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IEnumerable<(int,string)>)dictionary).GetEnumerator();
        }
}

我的理解是ConcurrentDictionary实现IEnumerable,因此我应该能够简单地转发这些方法调用。起初我以为它可能与不变/协变类型参数有关]

我想遍历我的值,而不是键和值对。

经过很多思考

我无法理解为什么如果类型在编译时显然可以正常运行,为什么我会在运行时出现错误。首先,应NOT

进行编译。我想念什么?

我有某种想法,为什么if I look at this answer却是在讲IEnumerable的类型转换,其中IEnumerable具有1个泛型类型参数而2个泛型类型参数。这种差异还不够吗?从编译器检测不到吗?

我发现了一个非常令人困惑的问题,希望您能帮助我理解此问题。我的目标是要有一个结构,为了便于阅读,我可以轻松地对其进行迭代。不幸的是,我收到了...

c# dictionary generics exception ienumerable
1个回答
0
投票

ConcurrentDictionary实现为ConcurrentDictionary,在您的情况下,IEnumerable<KeyValuePair<TKey,TValue>>TKeystringTValue。要获得(int,string),应使用字典的IEnumerable<(int,string)>属性。 Values属性具有Values类型,它继承了ICollection<TValue>。您的情况是ICollection<TValue>

© www.soinside.com 2019 - 2024. All rights reserved.