Как я могу преобразовать общий список в список?

#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 .