c# - 为什么将 IDictionary<TKey, TValue> 向上转换为 IEnumerable<object> 会失败?

标签 c# .net casting c#-6.0 .net-4.6

请看下面的代码片段:

(IEnumerable<object>)new Dictionary<string, string>()

上面的转换会抛出一个无效的转换异常。

实际上,IDictionary<TKey, TValue>还间接实现了 IEnumerable<out T> ,因为它还实现了 ICollection<T> .也就是说,整个 Actor 阵容应该是有效的。

事实上,对我来说更奇怪的是,如果我在调试器 watch 插槽上运行整个转换,它会工作!

Enter image description here

这是怎么回事?

最佳答案

那个字典确实实现了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/

相关文章:

c# - 在 EntityFramework 和 SQL Anywhere 作为提供者中使用字符串作为 PK 更新实体

c# - C#中的父子继承管理

java - py4j 中的 scala 类型转换是如何完成的?

c++ - 如何摆脱空指针

c# - 在方法参数中包含 OrderBy 委托(delegate)

c# - 如何将按钮添加到 HeroCard 并在单击时选择值

.net - 我什么时候应该使用 SQLTransaction

c# - 您如何使用技术(已描述)处理 .Net 中的 C 结构和指针?

.net - 跟踪监听器忽略traceOutputOptions ="DateTime"

java - Java中的加宽或自动类型转换;为什么会有精度损失?