我发现了一个非常令人困惑的问题,希望您能帮助我理解此问题。我的目标是要有一个结构,为了便于阅读,我可以轻松地对其进行迭代。不幸的是,我收到了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,因此我应该能够简单地转发这些方法调用。起初我以为它可能与不变/协变类型参数有关]
但是这不能向我解释这种行为。因此,我检查了Microsoft的文档:ConcurrentDictionary,发现我的习惯:
经过很多思考
我无法理解为什么如果类型在编译时显然可以正常运行,为什么我会在运行时出现错误。首先,应NOT
进行编译。我想念什么?我有某种想法,为什么if I look at this answer却是在讲IEnumerable的类型转换,其中IEnumerable具有1个泛型类型参数而2个泛型类型参数。这种差异还不够吗?从编译器检测不到吗?
我发现了一个非常令人困惑的问题,希望您能帮助我理解此问题。我的目标是要有一个结构,为了便于阅读,我可以轻松地对其进行迭代。不幸的是,我收到了...
ConcurrentDictionary
实现为ConcurrentDictionary
,在您的情况下,IEnumerable<KeyValuePair<TKey,TValue>>
为TKey
,string
为TValue
。要获得(int,string)
,应使用字典的IEnumerable<(int,string)>
属性。 Values
属性具有Values
类型,它继承了ICollection<TValue>
。您的情况是ICollection<TValue>
。