#c# #generics
#c# #общие
Вопрос:
Как я могу преобразовать общий список в список?
Я использую ListCollectionView
, и мне нужно предоставить ему IList
не IList<T>
.
Я вижу множество примеров преобразования IList
в IList<T>
, но не наоборот.
Мне просто преобразовать его вручную ( new List().AddRange(IList<T>
)?
Ответ №1:
Чтобы прояснить другие ответы:
IList<T>
не требует, чтобы реализующий тип также реализовывался IList
. IEnumerable<T>
требуется IEnumerable
. Это сойдет нам с рук с помощью IEnumerable<T>
, потому что последовательность T всегда можно рассматривать как последовательность объектов. Но список жирафов нельзя рассматривать как список объектов; вы можете добавить тигра в список объектов.
Однако List<T>
это небезопасная реализация IList
. Если вы попытаетесь добавить tiger в List<Giraffe>
, сначала приведя его к IList, вы получите исключение.
Итак, чтобы ответить на вопрос: если все, что у вас есть под рукой, это IList<T>
, вы можете умозрительно преобразовать его в IList
с помощью оператора «as», а если это не удается, то создайте новое ArrayList
или List<object>
и скопируйте содержимое. Если то, что у вас в руках, является List<T>
то у вас уже есть что-то, что реализует IList
напрямую.
Комментарии:
1. <<… добавить тигра в список<Giraffe>… вы получите исключение.>> не говоря уже о неприятном беспорядке. —ценю объективацию -vHelpful.
Ответ №2:
Поскольку List<T>
реализуется IList
интерфейс, вы можете просто предоставить List<T>
. При необходимости просто приведите его:
List<int> list = new List<int>();
IList ilist = (IList)list;
Ответ №3:
Вам вообще не нужно выполнять никакого преобразования. A List<T>
реализует IList
интерфейс.
Если вам нужен тип, IList
например, для использования определенной перегрузки, просто используйте синтаксис приведения (IList)theList
.