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

C# IEnumerable.GetEnumerator引发InvalidCastException->;为什么我没有得到编译时错误?,c#,dictionary,generics,exception,ienumerable,C#,Dictionary,Generics,Exception,Ienumerable,我发现了一个非常令人困惑的问题,我希望你能帮助我理解这个问题。 我的目标是要有一个结构,我可以很容易地迭代可读性的目的。 不幸的是,我接受了无效的例外,我不明白为什么会发生这种情况。我认为编译器不应该能够编译它: 最初 我希望它能开箱即用,因为我让接口在重塑器的帮助下在该结构的一个字段上实现,但在运行unittests(幸运的是在那里,而不是在生产中)尝试在我的字段上迭代时,我收到了一个InvalidCastException 正如我所说,问题发生在迭代时,这意味着GetEnumerator()

我发现了一个非常令人困惑的问题,我希望你能帮助我理解这个问题。 我的目标是要有一个结构,我可以很容易地迭代可读性的目的。 不幸的是,我接受了无效的例外,我不明白为什么会发生这种情况。我认为编译器不应该能够编译它:

最初

我希望它能开箱即用,因为我让接口在重塑器的帮助下在该结构的一个字段上实现,但在运行unittests(幸运的是在那里,而不是在生产中)尝试在我的字段上迭代时,我收到了一个InvalidCastException

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

就我所知,关于接口的实现,我没有做任何错误,这至少是显而易见的

公共结构测试:IEnumerable
{
公共词典;
公共IEnumerator GetEnumerator()
{
return((IEnumerable)dictionary.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return((IEnumerable)dictionary.GetEnumerator();
}
}
我的理解是ConcurrentDictionary实现IEnumerable,因此我应该能够简单地转发这些方法调用。起初,我认为它可能与不变/协变类型参数有关

但这并不能向我解释这种行为。所以我查看了微软的文档:发现了我的白痴:我想迭代我的值,而不是一对键和值。


经过深思熟虑

如果类型在编译时工作正常,我无法理解为什么在运行时会出现错误。它首先应该而不是编译。我错过了什么


我想知道为什么,但我们谈论的是一个IEnumerable的类型转换,它有1个泛型类型参数和2个泛型类型参数。这种差异还不够吗?这难道不能从编译器中检测出来吗?

Typo<代码>返回((IEnumerable)dictionary.Values).GetEnumerator()或实际上
返回dictionary.Values.GetEnumerator()字典实现
IEnumerable
,字典值集合继承
IEnumerable
type所有泛型类型都是在运行时构造的,而不是在编译时。因此,不正确的转换在运行时失败,这是一个主要原因,IMO
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();
        }
}