You need to enable JavaScript to run this app. 实现IIdentifiers的子类List集合如何存入泛型Dictionary<string, List<IIdentifiers>>
优惠活动
大模型
产品
解决方案
定价
更多

实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 19:30:04