IEnumerable <object> a = new IEnumerable <object> (); ¿Puedo hacer esto?

95

Quiero crear una nueva instancia de un objeto IEnumerable<object>

¿Puedo hacer esto?

IEnumerable<object> a = new IEnumerable<object>();
WingMan20-10
fuente
1
No, y ni siquiera tiene sentido.
CodesInChaos
3
@ WingMan20-10: Bueno, eso cambia TODO. No se puede agregar a un genérico IEnumerable<T>. Tienes que usar algo como List<T>.
jason
1
En este caso, necesita una matriz concreta List <object> objs = new IEnumerable <object>. No puede agregar elementos a un iterador porque no es una colección ... es un iterador :)
user44298
1
@ivo: Tenga en cuenta que IEnumerable<T>no representa un iterador, representa una secuencia iterable . IEnumerator<T>en sí mismo representa el iterador.
Jon Skeet

Respuestas:

117

Por ejemplo, puede crear una instancia de List<object>, que implementa IEnumerable<object>. Ejemplo:

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

IEnumerable<object> en = list;
CallFunction(en);
Stefan Schultze
fuente
11
Dado que la pregunta muestra el uso de genéricos, dar un ejemplo de un tipo que no implementa el genérico IEnumerable<T>es una mala idea, en mi opinión.
Jon Skeet
Cualquier problema con el uso de CallFunction (list.AsEnumerable ()) en lugar de IEnumerable <object> en = list; ...
Gina Marano
Usaría una matriz con inicializador literal si es posible, es el tipo enumerable más eficiente y liviano disponible en .NET y no tiene la sobrecarga de List <>. Las listas solo deben usarse si realmente necesita o desea mutar después de la inicialización. Además, es mejor agregar System.Linq e invocar .AsEnumerable () en la matriz o lista.
Mark
33

Como ahora especificó que desea agregarle, lo que desea no es simple, IEnumerable<T>sino al menos un ICollection<T>. Recomiendo simplemente usar un List<T>como este:

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

Puede usar myList en cualquier lugar donde IEnumerable<object>se espere, ya que List<object>implements IEnumerable<object>.

(respuesta anterior antes de aclaración)

No puede crear una instancia de IEnumerable<T>ya que es una interfaz normal (a veces es posible especificar una implementación predeterminada, pero generalmente se usa solo con COM).

Entonces, lo que realmente desea es crear una instancia de una clase que implemente la interfaz IEnumerable<T> . El comportamiento varía según la clase que elija.

Para una secuencia vacía use:

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

Para un enumerable no vacío, puede usar alguna colección que implemente IEnumerable<T>. Las opciones comunes son la matriz T[], List<T>o si desea inmutabilidad 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});

Otra forma común de implementar IEnumerable<T>es la característica de iterador introducida en C # 3:

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

IEnumerable<object> e4=MyIterator();
CódigosInChaos
fuente
24

No, no puedes, ya que IEnumerablees una interfaz.

Debería poder crear una instancia vacía de la mayoría de los tipos que no son de interfaz que implementan IEnumerable, por ejemplo: -

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

o

IEnumerable<object> a = new List<object>();
Adam Ralph
fuente
@AdamRalph: voté en contra y luego me distraí, así que no pude dejar un comentario de inmediato. Las interfaces son tipos, por lo que su respuesta es peligrosamente incorrecta porque propaga un error común.
jason
7

No, no puedes hacer eso. Utilice la siguiente línea de código en su lugar:

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

Espero que ayude.

Ricardo de Assuncao Goncalves
fuente
1

Quería crear un nuevo objeto o lista enumerable y poder agregarlo.

Este comentario lo cambia todo. No se puede agregar a un genérico IEnumerable<T>. Si desea permanecer con las interfaces System.Collections.Generic, debe usar una clase que implemente ICollection<T>like List<T>.

jason
fuente
1

La razón principal es que no podemos crear el objeto de una interfaz e IEnumerable es una interfaz . Necesitamos crear un objeto de la clase que implementa la interfaz. Esta es la razón principal por la que no podemos crear directamente un objeto de IEnumerable.

Pawan
fuente
0

No IEnumerable es una interfaz, no puede crear una instancia de interfaz

puedes hacer algo como esto

IEnumerable<object> a = new object[0];
Arsen Mkrtchyan
fuente
¿Es posible crear una instancia de interfaz COM como esa @Jon Skeet?
Arsen Mkrtchyan
1
Creo que es posible especificar una implementación predeterminada que se instancia en lugar de la interfaz para interfaces COM.
CodesInChaos
@JonSkeet ¿no es más exacto decir que la llamada new SomeComInterface()crea una instancia del "CoClass" asociado a la interfaz en lugar de crear una instancia de la interfaz en sí?
phoog
@phoog: Eso sería exacto, pero lo importante y extraño es que puedes usarlo newcon una interfaz en ciertas situaciones.
Jon Skeet
0

Puedes hacerlo:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
N Djel Okoye
fuente