Есть классы
public class Parent
{}
public class ChildOne : Parent
{}
Текущее решение при переприсваивании списков:
public class Manager
{
private IList<Parent> _items = new List<Parent>();
public void DoSomething()
{
IList<ChildOne> childrenOne = GetChildrenOne();
foreach (ChildOne child in childrenOne)
{
_items.Add(child);
}
}
public IList<ChildOne> GetChildrenOne()
{
List<ChildOne> children = new List<ChildOne>();
...
return children;
}
}
А хотелось бы чего-то типа:
public class Manager
{
private IList<Parent> _items = null;
public void DoSomething()
{
_items = GetChildrenOne();
}
...
}
Есть ли какое-то решение или так и придётся по одному переприсваивать?
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, dm-CaT, Вы писали:
DC>>Есть ли какое-то решение или так и придётся по одному переприсваивать?
N>Придется по одному — так как дженерики в C# не могут быть ковариантны. Конкретно в случае с mutable списком (каким является класс List<T>) невозможно было бы сделать безопасную ковариантность, даже если бы язык ее поддерживал.
+1
аккуратнее можно было бы вывернуться в случае, если бы требовалось преобразование IEnumerable<parent> = IEnumerable<child>.
static class CovariantEnumAdapter<TBase>
{
public static IEnumerable<TBase> Get<TDerived>(IEnumerable<TDerived> enumerable)
where TDerived : TBase
{
foreach (TDerived item in enumerable)
{
yield return item;
}
}
}
class Base {}
class Derived : Base {}
IEnumerable<Derived> enum1 = ...
IEnumerable<Base> enum2 = CovariantEnumAdapter<Base>.Get(enum1);