IEnumerable <object> a = new IEnumerable <object> (); Mogę to zrobić?


95

Chcę utworzyć nową instancję obiektu IEnumerable<object>

Mogę to zrobić?

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


1
Nie, i to nawet nie ma sensu.
CodesInChaos

3
@ WingMan20-10: Cóż, to zmienia WSZYSTKO. Nie możesz dodać do ogólnego IEnumerable<T>. Musisz użyć czegoś takiego List<T>.
jason

1
W takim przypadku potrzebujesz konkretnej tablicy List <object> objs = new IEnumerable <object>. Nie możesz dodawać elementów do iteratora, ponieważ to nie jest kolekcja ... to iterator :)
user44298

1
@ivo: Zauważ, że IEnumerable<T>nie reprezentuje iteratora - reprezentuje iterowalną sekwencję. IEnumerator<T>sama reprezentuje iterator.
Jon Skeet,

Odpowiedzi:


117

Możesz na przykład utworzyć instancję programu List<object>, który implementuje IEnumerable<object>. Przykład:

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

IEnumerable<object> en = list;
CallFunction(en);

11
Biorąc pod uwagę, że pytanie pokazuje użycie typów generycznych, podany przykład typu, który nie implementuje generycznego, IEnumerable<T>jest złym pomysłem IMO.
Jon Skeet,

Każdy problem z używaniem CallFunction (list.AsEnumerable ()) zamiast IEnumerable <object> en = list; ...
Gina Marano

Jeśli to możliwe, użyłbym tablicy z inicjatorem literału, jest to najbardziej wydajny i lekki typ wyliczalny dostępny w .NET i nie ma narzutu List <>. Listy powinny być używane tylko wtedy, gdy naprawdę potrzebujesz lub chcesz dokonać mutacji po inicjalizacji. Ponadto lepiej jest dodać System.Linq i wywołać .AsEnumerable () w tablicy lub liście.
Mark

33

Ponieważ teraz określiłeś, że chcesz do niego dodać, to, co chcesz, nie jest proste, IEnumerable<T>ale przynajmniej ICollection<T>. Polecam po prostu użycie List<T>takiego:

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

Możesz używać myList wszędzie tam, gdzie jest IEnumerable<object>to oczekiwane, ponieważ List<object>implementuje IEnumerable<object>.

(stara odpowiedź przed wyjaśnieniem)

Nie można utworzyć instancji programu, IEnumerable<T>ponieważ jest to normalny interfejs (czasami można określić domyślną implementację, ale jest ona zwykle używana tylko z COM).

Więc to, czego naprawdę chcesz, to utworzenie instancji klasy, która implementuje interfejs IEnumerable<T> . Zachowanie różni się w zależności od wybranej klasy.

W przypadku pustej sekwencji użyj:

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

W przypadku niepustej wyliczalnej można użyć kolekcji, która implementuje IEnumerable<T>. Powszechne wybory są tablica T[], List<T>lub jeśli chcesz niezmienność 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});

Innym typowym sposobem implementacji IEnumerable<T>jest funkcja iteratora wprowadzona w C # 3:

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

IEnumerable<object> e4=MyIterator();


24

Nie, nie możesz, ponieważ IEnumerablejest to interfejs.

Powinieneś być w stanie utworzyć pustą instancję większości typów nieinterfejsowych, które implementują IEnumerable, np .: -

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

lub

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

@AdamRalph: Głosowałem w dół, a potem się rozproszyłem, więc nie mogłem od razu zostawić komentarza. Interfejsy są typami, więc twoja odpowiedź jest niebezpiecznie błędna, ponieważ propaguje powszechne nieporozumienie.
jason

7

Nie, nie możesz tego zrobić. Zamiast tego użyj następującego wiersza kodu:

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

Mam nadzieję, że to pomoże.


1

Chciałem utworzyć nowy wyliczalny obiekt lub listę i móc do niego dodawać.

Ten komentarz zmienia wszystko. Nie możesz dodać do ogólnego IEnumerable<T>. Jeśli chcesz pozostać przy interfejsach w programie System.Collections.Generic, musisz użyć klasy, która implementuje ICollection<T>taką jak List<T>.


1

Głównym powodem jest to, że nie możemy utworzyć obiektu interfejsu, a IEnumerable jest interfejsem . Musimy stworzyć obiekt klasy implementującej interfejs. To jest główny powód, dla którego nie możemy bezpośrednio utworzyć obiektu IEnumerable.


0

Żaden IEnumerable nie jest interfejsem, nie można utworzyć wystąpienia interfejsu

możesz zrobić coś takiego

IEnumerable<object> a = new object[0];

Czy jest możliwe stworzenie takiej instancji interfejsu COM @Jon Skeet?
Arsen Mkrtchyan,


1
Myślę, że możliwe jest określenie domyślnej implementacji, która jest tworzona zamiast interfejsu dla interfejsów COM.
CodesInChaos

@JonSkeet, czy nie jest dokładniejsze stwierdzenie, że wywołanie new SomeComInterface()tworzy instancję powiązaną z interfejsem „CoClass” zamiast tworzenia instancji samego interfejsu?
phoog

@phoog: To byłoby dokładne - ale ważną i dziwną rzeczą jest to, że neww pewnych sytuacjach można używać interfejsu.
Jon Skeet

0

Możesz to zrobić:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.