Re[2]: Как реализовать IList<parent> = IList<child>
От: desco США http://v2matveev.blogspot.com
Дата: 12.08.07 08:54
Оценка: 1 (1)
Здравствуйте, 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.