IEnumerable <object>a = новый IEnumerable <object>();Я могу это сделать? - PullRequest
75 голосов
/ 05 января 2011

Я хочу создать новый экземпляр объекта IEnumerable<object>

Можно ли это сделать?

IEnumerable<object> a = new IEnumerable<object>();

Ответы [ 8 ]

88 голосов
/ 05 января 2011

Например, вы можете создать экземпляр List<object>, который реализует IEnumerable<object>. Пример:

List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);

IEnumerable<object> en = list;
CallFunction(en);
31 голосов
/ 05 января 2011

Поскольку вы указали, что хотите добавить к нему, то, что вы хотите, это не просто IEnumerable<T>, а по крайней мере ICollection<T>.Я рекомендую просто использовать List<T> следующим образом:

List<object> myList=new List<object>();
myList.Add(1);
myList.Add(2);
myList.Add(3);

Вы можете использовать myList везде, где ожидается IEnumerable<object>, поскольку List<object> реализует IEnumerable<object>.

(старый ответ до уточнения)

Вы не можете создать экземпляр IEnumerable<T>, поскольку это обычный интерфейс (иногда можно указать реализацию по умолчанию, но обычно она используется только с COM).

Так что вы действительно хотите создать экземпляр класса , который реализует интерфейс IEnumerable<T>.Поведение варьируется в зависимости от того, какой класс вы выбираете.

Для пустой последовательности используйте:

IEnumerable<object> e0=Enumerable.Empty<object>();

Для непустого перечислимого вы можете использовать некоторую коллекцию, которая реализует IEnumerable<T>.Распространенными вариантами являются массивы T[], List<T> или, если вам нужна неизменность ReadOnlyCollection<T>.

IEnumerable<object> e1=new object[]{1,2,3};
IEnumerable<object> e2=new List<object>(){1,2,3};
IEnumerable<object> e3=new ReadOnlyCollection(new object[]{1,2,3});

. Другой распространенный способ реализации IEnumerable<T> - это функция итератора , введенная вC # 3:

IEnumerable<object> MyIterator()
{
  yield return 1;
  yield return 2;
  yield return 3;
}

IEnumerable<object> e4=MyIterator();
21 голосов
/ 05 января 2011

Нет, вы не можете, так как IEnumerable - это интерфейс.

Вы должны иметь возможность создавать пустой экземпляр большинства неинтерфейсных типов, которые реализуют IEnumerable, например ::-

IEnumerable<object> a = new object[] { };

или

IEnumerable<object> a = new List<object>();
19 голосов
/ 01 апреля 2015

Другое решение было бы использовать Empty.

IEnumerable<object> a = Enumerable.Empty<object>();

есть поток на SO по этому поводу: Лучше ли использовать Enumerable.Empty () в отличие от нового List для инициализации IEnumerable?

7 голосов
/ 11 декабря 2016

Нет, вы не можете этого сделать.Вместо этого используйте следующую строку кода:

IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();

Надеюсь, это поможет.

1 голос
/ 05 сентября 2016

Основная причина - , мы не можем создать объект интерфейса, а IEnumerable - это интерфейс . Нам нужно создать объект класса, который реализует интерфейс. Это основная причина, по которой мы не можем напрямую создать объект IEnumerable.

1 голос
/ 05 января 2011

Я хотел создать новый перечисляемый объект или список и иметь возможность добавить к нему.

Этот комментарий меняет все.Вы не можете добавить к универсальному IEnumerable<T>.Если вы хотите остаться с интерфейсами в System.Collections.Generic, вам нужно использовать класс, который реализует ICollection<T> как List<T>.

0 голосов
/ 05 января 2011

Нет IEnumerable - это интерфейс, вы не можете создать экземпляр интерфейса

вы можете сделать что-то вроде этого

IEnumerable<object> a = new object[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...