为什么将IDictionary <TKey,TValue>上传到IEnumerable <object>会失败?

Mat*_*zer 19 .net c# casting c#-6.0 .net-4.6

请参阅以下代码段:

(IEnumerable<object>)new Dictionary<string, string>()
Run Code Online (Sandbox Code Playgroud)

上面的强制转换将抛出无效的强制转换异常.

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

事实上,对我来说更奇怪的是,如果我在调试器手表插槽上运行整个演员,它就可以了!

在此输入图像描述

这是怎么回事?

Pat*_*man 24

那本字典确实实现了IEnumerable<KeyValuePair<TKey, TValue>>IEnumerable,而是IEnumerable一个结构是不一样IEnumerable的一个对象.方差仅适用于参考类型.

这确实在我的最终工作,应该是合乎逻辑的选择:

var x = (IEnumerable)new Dictionary<string, string>();
Run Code Online (Sandbox Code Playgroud)

作为一个示例,这确实有效:

List<string> l = new List<string>();
var x = (IEnumerable<object>)l;
Run Code Online (Sandbox Code Playgroud)

但是这个没有:

List<DateTime> l2 = new List<DateTime>();
var x = (IEnumerable<object>)l2;
Run Code Online (Sandbox Code Playgroud)

清楚地表明结构是问题.

(为什么它在你的Watch窗口中工作,我不知道)

  • 相关:[_"方差仅适用于参考类型"_](http://stackoverflow.com/questions/2783233/is-this-a-covariance-bug-in-c-sharp-4) (6认同)