为什么向IEnumerable <object>上传IDictionary <tkey,tvalue =“”>会失败?

时间:2016-07-18 09:32:17

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

请参阅以下代码段:

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

以上演员表会抛出无效的演员表异常。

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

事实上,对我来说更奇怪的是,如果我在调试器 watch 插槽上运行整个演员,它可以正常工作

Enter image description here

发生了什么事?

4 个答案:

答案 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)