我有:
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。所以问题是为什么我不能把它从接口转换成类型呢?除了首先改变它的存储方式之外,还有什么解决方案吗?
发布于 2009-06-30 15:53:24
您只能重新转换最外层的接口/类名,而不能重新转换泛型参数。第二次强制转换不起作用的原因与您不能从一种数组类型强制转换为另一种数组类型的原因相同,即使您可以强制转换“包含的”对象。原因如下:
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>;同样的事情也会发生在你的第二个案例中。你可以将某种IDictionary添加到OldDic1中,但实际上它并不是一个Dictionary,然后dic1就会爆炸。它将有一个非Dictionary的值。啊罗!
所以,当你有了容器,你可以在IList<X>和List<X>之间来回切换,只要X是的,每个容器的都是相同的。
发布于 2009-06-30 15:51:50
该行为与C#中的as keyword相关。字典和IDictionary不是一回事。
如果你选择了另一种方式,你也许能够让它在下一个增加了对covariance and contravariance支持的.NET版本中工作。
您可能想要确定为什么需要强制转换到具体的字典/列表的解决方案,如果这是必需的,然后更改类型的存储。
https://stackoverflow.com/questions/1064423
复制相似问题