IEnumerable<KeyValuePair<TKey, TValue>>
和 IEnumerable
,但是结构体的 IEnumerable
与对象的 IEnumerable
不同。 协变仅适用于引用类型。 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;
明确指出结构体是问题所在。
(为什么它能够在您的监视窗口中工作,我不知道)
IEnumerable<T>
是协变的! - Matías FidemraizerKeyValuePair
是一个值类型。List<int> ints = new List<int>();
var objs = (IEnumerable<object>)ints;
This would work:
List<string> ints = new List<string>();
var objs = (IEnumerable<object>)ints;
如果您实在无法使用普通的IEnumerable
,请尝试以下方法:
new Dictionary<string, string>().Cast<object>();
Enumerable.Cast
会产生一个新的可枚举对象,而我需要保持相同的实例并将其转换为整个类型实现的不同接口。 - Matías FidemraizerDictionary<string, string>
进行子类化吗?如果可以的话,你就可以让它实现 IEnumerable<object>
。 - Paulo Morgado这很奇怪。您的代码片段在 .NET 4.0 中运行良好。我建议您将其转换为 IEnumerable
。
阅读:IDictionary Interface(MSDN)
IEnumerable<T>
的接口具有协变类型参数。即使协变无法与值类型一起使用.............我错了吗? - Matías FidemraizerIEnumerable<out T>
。 - Matías FidemraizerIEnumerable<string>
和IEnumerable<int>
不是同一种类型,但当你实现它们时,你正在实现IEnumerable<out T>
。 - Matías Fidemraizershort s; var o = (object)s; var i = (int)o;
它无法确定o
中实际上是一个short
,唯一能使其正常工作的方法是在运行时启动一个小型编译器实例来查找适当的转换方法。我的理解是,VS的调试功能已经在使用它们自己的编译器实例,因此这种限制没有任何好处。 - Zev Spitz