Recientemente tuve problemas al intentar AddRange (IEnumerable) en una lista. Probablemente sea un problema clásico, pero realmente no lo entiendo todavía.C# No se puede convertir de IEnumerable <Base> a IEnumerable <Derived>
Entiendo que los métodos que esperan un parámetro de lista no están satisfechos con una lista, ya que pueden intentar agregar una base a la lista, lo cual es obviamente imposible.
Pero si obtengo esto correctamente, dado que los IEnumerables no se pueden cambiar, debería funcionar en este caso.
El código pensé en el siguiente aspecto:
class Foo
{
}
class Bar : Foo
{
}
class FooCol
{
private List<Foo> m_Foos = new List<Foo>();
public void AddRange1(IEnumerable<Foo> foos)
{
m_Foos.AddRange (foos); // does work
}
public void AddRange2<T>(IEnumerable<T> foos) where T : Foo
{
m_Foos.AddRange (foos); // does not work
}
}
class Program
{
static void Main(string[] args)
{
FooCol fooCol = new FooCol();
List<Foo> foos = new List<Foo>();
List<Bar> bars = new List<Bar>();
fooCol.AddRange1 (foos); // does work
fooCol.AddRange1 (bars); // does not work
fooCol.AddRange2 (foos); // does work
fooCol.AddRange2 (bars); // does work
}
}
me trató de pasar una sugerencia para el compilador en el método AddRange2, pero esto sólo se trasladaron a un problema alrededor.
¿Es mi forma de pensar defectuosa? ¿Es esto una limitación del lenguaje o es por diseño?
IIRC, el soporte para este tipo de operaciones se agregó a Java 1.5, por lo que tal vez se agregará a C# en algún momento en el futuro, también ...?
Duplicado de varias otras preguntas, incluyendo la más reciente http://stackoverflow.com/questions/632399 –
De hecho, lo siento. Mi google-jutsu aún necesita mejoras. – mafu
No hay problema. Sería bueno tener preguntas frecuentes por etiqueta, IMO ... –