强制转换包含泛型字典的泛型字典
本文关键字:泛型 字典 包含 转换 | 更新日期: 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>>
对添加到原始集合中,而显然原始对象可能存在类型冲突。因此,不支持