首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IDictionary,字典

IDictionary,字典
EN

Stack Overflow用户
提问于 2009-06-30 15:40:57
回答 2查看 3.1K关注 0票数 0

我有:

代码语言:javascript
运行
复制
IDictionary<string, IDictionary<string, IList<long>>> OldDic1; 

(仅出于说明目的,它被实例化并具有值-在其他地方)

为什么我可以这样做:?

代码语言:javascript
运行
复制
Dictionary<string, IDictionary<string, IList<long>>> dic1 = 
  OldDic1 as Dictionary<string, IDictionary<string, IList<long>>>;

基本上,执行此行后的dic1具有来自OldDic1;的所有值。

然而,当我这样做的时候:

代码语言:javascript
运行
复制
Dictionary<string, Dictionary<string, List<long>>> dic1 = 
  OldDic1 as Dictionary<string, Dictionary<string, List<long>>>;

我得到null,它和强制转换一样,除了它不会崩溃,而是返回null。所以问题是为什么我不能把它从接口转换成类型呢?除了首先改变它的存储方式之外,还有什么解决方案吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-30 15:53:24

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

代码语言:javascript
运行
复制
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的,每个容器的都是相同的。

票数 2
EN

Stack Overflow用户

发布于 2009-06-30 15:51:50

该行为与C#中的as keyword相关。字典和IDictionary不是一回事。

如果你选择了另一种方式,你也许能够让它在下一个增加了对covariance and contravariance支持的.NET版本中工作。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1064423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档