泛型类中同类型List变量赋值失败问题求助
问题分析与解决
核心原因
编译期编译器仅知道TPrincipalInfo是E_grupo_producto的子类(或自身),但List<T>是不变泛型类型——即便TSub继承自TBase,List<TSub>和List<TBase>也不能直接互相转换。你看到MessageBox显示true是因为运行时当TPrincipalInfo恰好等于E_grupo_producto时,两者实际类型一致,但编译期无法提前确定这一点,因此报错。
解决方案
方案1:使用Cast<T>转换(适用于TPrincipalInfo就是E_grupo_producto的场景)
如果你的泛型类仅在TPrincipalInfo = E_grupo_producto时使用,可通过Cast<T>强制转换元素类型,再转为List<TPrincipalInfo>:
principalList = lista.Cast<TPrincipalInfo>().ToList();
方案2:手动映射属性(适用于TPrincipalInfo是E_grupo_producto子类的场景)
如果TPrincipalInfo是E_grupo_producto的子类,单纯Cast会抛出InvalidCastException,需要逐个映射属性实例化子类对象:
principalList = lista.Select(item => new TPrincipalInfo { // 按实际属性逐一赋值 GrupoId = item.GrupoId, NombreGrupo = item.NombreGrupo, // 其他属性... }).ToList();
如果属性较多,也可以用AutoMapper等工具简化映射逻辑。
方案3:绕开编译检查的强制转换(不推荐,仅临时应急)
若你能确保运行时lista的类型必然是List<TPrincipalInfo>,可通过object中转绕开编译期检查,但这种写法破坏了泛型的类型安全性,仅适合确定类型完全匹配的场景:
principalList = (List<TPrincipalInfo>)(object)lista;
内容的提问来源于stack exchange,提问作者Kong Fan
相关产品推荐
相关产品推荐

