No puedo entender por qué el siguiente código C # no se compila.
Como puede ver, tengo un método genérico estático Algo con un IEnumerable<T>
parámetro (y T
está restringido a ser una IA
interfaz), y este parámetro no se puede convertir implícitamente a IEnumerable<IA>
.
Cual es la explicacion (No busco una solución alternativa, solo para entender por qué no funciona).
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
Error me pongo en Something2(bar)
línea:
Argumento 1: no se puede convertir de 'System.Collections.Generic.List' a 'System.Collections.Generic.IEnumerable'
T
a los tipos de referencia. Si usa la condición, where T: class, IA
entonces debería funcionar. La respuesta vinculada tiene más detalles.
Something2(foo);
directamente. No es necesario dar vueltas .ToList()
para obtener un List<T>
( T
es su parámetro de tipo declarado por el método genérico) para comprender esto (a List<T>
es un IEnumerable<T>
).