强制转换包含泛型字典的泛型字典

本文关键字:泛型 字典 包含 转换 | 更新日期: 2023-09-27 17:49:42

我有:

var someConcreteInstance = new Dictionary<string, Dictionary<string, bool>>();

,我希望将其强制转换为接口版本,即:

someInterfaceInstance = (IDictionary<string, IDictionary<string, bool>>)someConcreteInstance;

'someInterfaceInstance'是一个公共属性:

IDictionary<string, IDictionary<string, bool>> someInterfaceInstance { get; set; }

编译正确,但抛出运行时强制转换错误。

Unable to cast object of type 'System.Collections.Generic.Dictionary`2[System.String,System.Collections.Generic.Dictionary`2[System.String,System.Boolean]]' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Collections.Generic.IDictionary`2[System.String,System.Boolean]]'.

我错过了什么?(嵌套的泛型类型/Property的问题?)

强制转换包含泛型字典的泛型字典

其他答案都是正确的,但是为了清楚地说明为什么这是非法的,请考虑以下问题:

interface IAnimal {}
class Tiger : IAnimal {}
class Giraffe : IAnimal {}
...
Dictionary<string, Giraffe> d1 = whatever;
IDictionary<string, IAnimal> d2 = d1; // suppose this were legal
d2["blake"] = new Tiger(); // What stops this?

没有人能阻止你把一只老虎放进动物词典。但是这个字典实际上只包含长颈鹿。

出于同样的原因,你也不能走另一条路:

Dictionary<string, IAnimal> d3 = whatever;
d3["blake"] = new Tiger(); 
IDictionary<string, Giraffe> d4 = d3; // suppose this were legal
Giraffe g = d4["blake"]; // What stops this?

现在你把一只老虎放到了长颈鹿类型的变量中。

泛型接口协方差在c# 4中只有在编译器能够证明这种情况不会发生的情况下才合法。

IDictionary不支持协方差

看这里IDictionary

你最多能做的就是

IDictionary<string, Dictionary<string, bool>> viaInterface = someConcreteInstance

内部字典不能在这里引用不同的原因(或通过强制转换)是,虽然Dictionary<string, bool>IDictionary<string, bool>,但并非所有IDictionary对象都将是Dictionary对象。因此,获得纯接口强制转换似乎允许您将其他<string, IDictionary<string, bool>>对添加到原始集合中,而显然原始对象可能存在类型冲突。因此,不支持