C# IEnumerable.GetEnumerator引发InvalidCastException->;为什么我没有得到编译时错误?
我发现了一个非常令人困惑的问题,我希望你能帮助我理解这个问题。 我的目标是要有一个结构,我可以很容易地迭代可读性的目的。 不幸的是,我接受了无效的例外,我不明白为什么会发生这种情况。我认为编译器不应该能够编译它: 最初 我希望它能开箱即用,因为我让接口在重塑器的帮助下在该结构的一个字段上实现,但在运行unittests(幸运的是在那里,而不是在生产中)尝试在我的字段上迭代时,我收到了一个InvalidCastException 正如我所说,问题发生在迭代时,这意味着GetEnumerator()方法抛出InvalidCastException。我使用了什么作为要迭代的参考对象?这是一个ConcurrentDictionary(参见代码示例),我发现了几个关于IEnumerable接口的问题 就我所知,关于接口的实现,我没有做任何错误,这至少是显而易见的C# IEnumerable.GetEnumerator引发InvalidCastException->;为什么我没有得到编译时错误?,c#,dictionary,generics,exception,ienumerable,C#,Dictionary,Generics,Exception,Ienumerable,我发现了一个非常令人困惑的问题,我希望你能帮助我理解这个问题。 我的目标是要有一个结构,我可以很容易地迭代可读性的目的。 不幸的是,我接受了无效的例外,我不明白为什么会发生这种情况。我认为编译器不应该能够编译它: 最初 我希望它能开箱即用,因为我让接口在重塑器的帮助下在该结构的一个字段上实现,但在运行unittests(幸运的是在那里,而不是在生产中)尝试在我的字段上迭代时,我收到了一个InvalidCastException 正如我所说,问题发生在迭代时,这意味着GetEnumerator()
公共结构测试: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();
}
}