请参阅以下代码段:
(IEnumerable<object>)new Dictionary<string, string>()
以上演员表会抛出无效的演员表异常。
实际上,IDictionary<TKey, TValue>
也间接实现了IEnumerable<out T>
,因为它还实现了ICollection<T>
。也就是说,整个演员应该是有效的。
事实上,对我来说更奇怪的是,如果我在调试器 watch 插槽上运行整个演员,它可以正常工作!
发生了什么事?
答案 0 :(得分:24)
该字典确实实现了IEnumerable<KeyValuePair<TKey, TValue>>
和IEnumerable
,但结构的IEnumerable
与对象的IEnumerable
不同。 Variance only works for reference-types
这在我的最终确实有用,应该是合乎逻辑的选择:
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窗口中工作,我不知道)
答案 1 :(得分:4)
我认为这是因为KeyValuePair
是值类型。
这会失败:
List<int> ints = new List<int>();
var objs = (IEnumerable<object>)ints;
这样可行:
List<string> ints = new List<string>();
var objs = (IEnumerable<object>)ints;
字典也一样。
答案 2 :(得分:1)
如果你真的不能使用普通IEnumerable
,请试试这个:
new Dictionary<string, string>().Cast<object>();
答案 3 :(得分:0)
这很奇怪。您的代码片段适用于.NET 4.0。我建议你转为IEnumerable
。
阅读: IDictionary Interface (MSDN)