我有:

IDictionary<string, IDictionary<string, IList<long>>> OldDic1; 

(只是为了说明的目的,它被实例化,并且具有值 - 别处)

我为什么能做到这一点:

Dictionary<string, IDictionary<string, IList<long>>> dic1 = 
  OldDic1 as Dictionary<string, IDictionary<string, IList<long>>>;

执行该行之后基本上DIC1具有从OldDic1所有值;的工作原理。

然而,当我这样做:

Dictionary<string, Dictionary<string, List<long>>> dic1 = 
  OldDic1 as Dictionary<string, Dictionary<string, List<long>>>;

我得到空,这是一样的,除了它的铸造不会崩溃,而是返回null。所以,问题是,为什么我不能从接口类型投呢?是存在的溶液中,然后其他改变它是如何存储在第一地点?

有帮助吗?

解决方案

可以仅重新施放的最外界面/类名称,而不是通用的参数。你的第二个投不工作的原因是,你不能从一个数组类型转换为另一种,即使你可以施放“载”对象一样的道理。这里的原因:

List<object> objects;
List<string> strings;

objects = strings as List<object>;
// Uh oh, that's not a string!
objects.Add(42); 

objects = new List<object> { "The", "answer", "is", 42 };
// Uh oh, now strings contains an integer?
strings = objects as List<string>;

同样的事情会发生在你的第二个案例。你可以添加某种IDictionaryOldDic1这实际上不是一个Dictionary,然后dic1将炸毁。这将有一个非Dictionary值。 RUH ROH!

因此,当你有容器可以从IList<X>改变只要List<X>是的相同对于每个到X和背部。

其他提示

在行为与C#中的作为关键字。字典是不一样的东西作为一个IDictionary。

如果你是铸造的其他方式,你可以得到它在.NET的下一个版本已经增加了的协方差和逆变

您可能想确定解决方案的为什么您需要转换到具体的词典/列表,如果它需要的,然后更改类型的存储。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top