在值类型可以相互转换的情况下,为什么我不能将一种值类型的字典转换为另一种值类型的字典?可能重复:在C#中,为什么不能将List对象存储在List变量中为什么以下操作不起作用?列表castMe=newList();IEnumerablegetFromCast=(IEnumerable)castMe;//允许。DictionarycastMeDict=newDictionary();DictionarygetFromDict=(Dictionary)castMeDict;//不允许这是字典转换机制中的缺陷,还是我认为应该允许这样做?谢谢。这是字典转换机制的缺陷,还是我认为应该允许这样做?在你的思想中。您期望字典在转换之间应该是协变的。他们不是因为以下原因。假设它们是,并推断可能出什么问题:Dictionary>castMeDict=newDictionary>();Dictionary>getFromDict=(Dictionary>)castMeDict;castMeDict[123]=新列表();IEnumerablestrings=getFromDict[123];//没问题!getFromDict[123]=newstring[]{“你好”};//大问题!字符串数组可以转换为IEnumerable,但不能转换为List。您只需将不是字符串列表的内容放入仅获取字符串列表的字典中。在C#中,如果满足以下所有条件,泛型类型可以是协变或逆变的:大多数条件在字典中不满足——它不是接口或委托,它不能证明是安全的,并且类型不是标记为方差安全。因此,字典不会改变。相反,IEnumerable确实满足所有这些条件。您可以在C#4中将IEnumerable转换为IEnumerable。如果您对变化主题感兴趣,请考虑阅读我关于该主题的两打文章:http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+逆变/协方差。有关为什么这可能是一件坏事的具体示例,请查看JonSkeet的回答。想想如果允许会发生什么,然后你这样做:getFromDict.Add(34,newHashSet);这是完全允许的;HashSet实现IEnumerable并且可以作为值添加到Dictionary>中。它不能添加到Dictionary>中,这才是对象的真正含义。如果您希望它作为只读IDictionary>,那么您可以从转换为IEnumerable的包装类中获得良好的效率。否则,您需要将值复制到一个新的Dictionary>。以上是C#学习教程:一个值类型的字典可以相互转换,为什么我不能将一个值类型的字典转换为另一个值类型的字典?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: