2012-01-26 238 views
1

按照隐式转换逻辑使类似:是否可以投射类型参数?

string str = "something"; 
Object o = str ; 

我期待的是分配给Dictionary<string, string>Dictionary<string, Object>是可能的,但这种情况并非如此。

是否有可能将字符串值强制转换为Object,而无需遍历keyValuePair-items?

编辑1:替换所有拳击/拆箱单词与转换和铸造评论和答案提到这不是Boxing问题。

谢谢大家

+4

字符串 - >对象不需要装箱。字符串是一个引用类型。 [拳击](http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx)用于值类型。 –

+9

你的意思是co-and contravariance。请阅读[this](http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx)以了解为什么它不可能用于字典 –

回答

3

铸字并不能帮助你在那里,但你可以转换一个到另一个LINQ:

Dictionary<string, object> newDict; 
newDict = dict.ToDictionary(pair => pair.Key, pair => (object)pair.Value); 
+0

谢谢你为你的答案,它的作品! – CloudyMarble

+3

虽然这确实编译和运行,但严格来说,它仍然只是在内部遍历KeyValuePairs,这是OP说他试图避免的东西 - 尽管它不完全清楚*为什么*他试图避免这种情况... –

+1

考虑到OP不知道LINQ,并且直接将模拟转换为普通模式并不奏效,它是实现这种转换的最快方式,尽管它循环使用字典,但它似乎仍然是最好的可用解决方案。 thanx全部再次 – CloudyMarble

2

这不是拳击,它是关于协方差和逆变。

通用型参数不是协变的。所以你不能这样做,至少在C#3.0中。在C#4.0中,该概念是借助inout关键字实现的,但通用字典没有改变。

您可以阅读更多关于协方差和反变化here及其后续部分。

+0

为链接+1 – CloudyMarble

1

如果有一个只读字典接口IReadableDictionary<TKey, out TValue>IReadableDictionary<TValue>(在索引器中使用'Object'类型),那么需要读取但不写入字典的代码可以接受任何带有值的字典(第二个接口将用于允许代码想要检索与Mammal的实例相关的basicThing的实例,接受诸如Dictionary<Cat, basicThing>Dictionary<Animal, DerivedThing>之类的事物)。从Dictionary<TKey, TValue>中派生出一个类并不难,并为这个类添加这样的接口,但我并不知道任何这样的标准接口。 ILookup模糊不清,但截然不同。

相关问题