0

我有:

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,它与强制转换相同,只是它不会崩溃,而是返回 null。所以问题是为什么我不能将它从接口转换为类型?有没有解决方案,除了首先改变它的存储方式吗?

4

2 回答 2

2

您只能重新转换最外层的接口/类名称,而不是泛型参数。您的第二次转换不起作用的原因与您无法从一种数组类型转换为另一种数组类型的原因相同,即使您可以转换“包含”对象也是如此。原因如下:

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>;

在你的第二种情况下也会发生同样的事情。您可以添加某种实际上不是 a 的IDictionary,然后会爆炸。它将具有非值。嗬嗬!OldDic1Dictionarydic1Dictionary

因此,当您拥有容器时,只要每个容器相同,您IList<X>可以来回切换。List<X>X

于 2009-06-30T15:53:24.437 回答
0

该行为与C#中的as 关键字有关。字典与 IDictionary 不同。

如果您以另一种方式进行转换,则可能可以使其在 .NET 的下一个版本中工作,该版本增加了对covariance 和 contravariance的支持。

您可能想要确定为什么需要转换为具体的 Dictionary/List 的解决方案,如果需要,则更改类型的存储。

于 2009-06-30T15:51:50.133 回答