实现IIdentifiers的子类List集合如何存入泛型Dictionary<string, List<IIdentifiers>>
问题原因
你遇到的报错是C#泛型的不变性特性导致的:
List<T>的泛型参数T默认是不变的,即使Areas实现了IIdentifiers接口,List<Areas>和List<IIdentifiers>仍然是两个完全独立的类型,不存在继承关系,无法直接隐式转换。
可行解决方案
方案1:转换集合元素类型(最常用)
调用LINQ的Cast<T>()方法将List<Areas>的元素统一转换为IIdentifiers类型,再生成新的List<IIdentifiers>存入字典:
// 需要先引入Linq命名空间 using System.Linq; // 原有字典定义不变 var CollectionSelectionTables = new Dictionary<string, List<IIdentifiers>>(); // 添加时做类型转换 CollectionSelectionTables.Add("areas", areas.Cast<IIdentifiers>().ToList());
你也可以在初始化areas集合时就直接声明为List<IIdentifiers>类型,后续就不需要额外转换:
List<IIdentifiers> areas = new List<Areas>(); // 后续添加Areas类型的元素不受影响 areas.Add(new Areas());
方案2:使用协变泛型接口(只读场景推荐)
如果你的业务逻辑只需要读取字典中存储的集合元素,不需要对集合做增删改操作,可以将字典的值类型改为支持协变的IEnumerable<IIdentifiers>:
// 修改字典定义,值类型改为支持协变的IEnumerable<> var CollectionSelectionTables = new Dictionary<string, IEnumerable<IIdentifiers>>(); // 此时可以直接添加List<Areas>类型的变量,不需要转换 CollectionSelectionTables.Add("areas", areas);
IEnumerable<out T>的泛型参数标记了out协变修饰符,支持子类类型的集合隐式转换为父类/父接口类型的集合,符合你的继承场景。
内容的提问来源于stack exchange,提问作者Acces969
相关产品推荐
相关产品推荐

