请看下面的代码片段:
(IEnumerable<object>)new Dictionary<string, string>()
上面的转换会抛出一个无效的转换异常。
实际上,IDictionary<TKey, TValue>
还间接实现了 IEnumerable<out T>
,因为它还实现了 ICollection<T>
.也就是说,整个 Actor 阵容应该是有效的。
事实上,对我来说更奇怪的是,如果我在调试器 watch 插槽上运行整个转换,它会工作!
这是怎么回事?
最佳答案
那个字典确实实现了IEnumerable<KeyValuePair<TKey, TValue>>
和 IEnumerable
,但是 IEnumerable
结构与 IEnumerable
不同一个对象。 Variance only works for reference-types . KeyValuePair<K, V>
是结构而不是类。
这对我来说确实有效,应该是合乎逻辑的选择:
var x = (IEnumerable)new Dictionary<string, string>();
作为示例,这确实有效:
List<string> l = new List<string>();
var x = (IEnumerable<object>)l;
但这个不是:
List<DateTime> l2 = new List<DateTime>();
var x = (IEnumerable<object>)l2;
清楚地表明结构是问题所在。
(为什么它在您的 Watch 窗口中起作用,我不知道)
关于c# - 为什么将 IDictionary<TKey, TValue> 向上转换为 IEnumerable<object> 会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38433217/