I have created a generic class with 2 type parameters but I can't assign a value to the List principalList that have the same type. _D_Data.GetGrupoProductoList() returns a List<E_grupo_producto>
public class N_TablaSolaBase<TPrincipalInfo, TData>
where TPrincipalInfo : E_grupo_producto, new()
where TData : D_Producto, new()
{
private TPrincipalInfo principalInfo= new TPrincipalInfo();
private List<TPrincipalInfo> principalList = new List<TPrincipalInfo>();
private TData _D_Data = new();
public List<TPrincipalInfo> GetPrincipalList()
{
var lista = _D_Data.GetGrupoProductoList();
MessageBox.Show((lista.GetType() == principalList.GetType()).ToString());
// show true
principalList = lista
// Can't convert List<E_grupo_producto> to List<TPrincipalInfo>
return principalList;
}
CodePudding user response:
You have a variance problem.
If you have; class Animal, class Dog : Animal & class Cat : Animal. Then a List<Animal> can store and retrieve any animal. But if the caller is expecting a List<Dog>, then you can't give them a List<Animal> as there might be a Cat in it. But also, if the caller has asked for a List<Animal>, you can't give them a List<Dog> as the caller might try to put a Cat in it.
Your class N_TablaSolaBase<TPrincipalInfo> allows the caller to specify if they want a List<E_grupo_producto> or only a List<OtherProduct> for some class OtherProduct : E_grupo_producto. If they've asked for only List<OtherProduct>, you can't give them a List<E_grupo_producto>.
You could add a runtime cast to return the list if the types actually match. But then why have the generic parameter if the only supported value is E_grupo_producto?
var lista = _D_Data.GetGrupoProductoList() as List<TPrincipalInfo>
?? throw new NotSupportedException();
Or you could change your D_Producto class to add a generic parameter, to ensure that GetGrupoProductoList returns a List<TPrincipalInfo>.
public class N_TablaSolaBase<TPrincipalInfo, TData>
where TPrincipalInfo : E_grupo_producto, new()
where TData : D_Producto<TPrincipalInfo>, new() {...}
public class D_Producto<TPrincipalInfo>
where TPrincipalInfo : E_grupo_producto, new() {
public List<TPrincipalInfo> GetGrupoProductoList() {...}
}
