IEnumerable <개체> a = 새 IEnumerable <개체> (); 할 수 있나요?


94

개체의 새 인스턴스를 만들고 싶습니다. IEnumerable<object>

할 수 있나요?

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


1
아뇨, 말도 안 돼요.
— CodesInChaos 2011 년

3
@ WingMan20-10 : 글쎄, 그것은 모든 것을 바꿉니다. 일반 IEnumerable<T>. 당신은 같은 것을 사용해야합니다 List<T>.
— 제이슨

1
이 경우 구체적인 배열 List <object> objs = new IEnumerable <object>가 필요합니다. 컬렉션이 아니기 때문에 반복기에 항목을 추가 할 수 없습니다. 반복기입니다.)
— user44298

1
@ivo : IEnumerable<T>반복자를 나타내는 것이 아니라 반복 가능한 시퀀스를 나타냅니다 . IEnumerator<T>자체는 반복자를 나타냅니다.
— Jon Skeet

답변:


117

예를 들어 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);

11
질문이 제네릭의 사용을 보여 주므로 제네릭을 구현하지 않는 유형의 예가 주어지면 IEnumerable<T>IMO가 좋지 않습니다.
— Jon Skeet 2011 년

사용에 문제 다음 CallFunction (list.AsEnumerable ()) 대신 IEnumerable을 <object> = EN리스트] ...
— 지나 Marano

가능한 경우 리터럴 이니셜 라이저와 함께 배열을 사용합니다. .NET에서 사용할 수있는 가장 효율적이고 가벼운 열거 형 유형이며 List <>의 오버 헤드가 없습니다. 목록은 초기화 후에 정말로 필요하거나 변경하려는 경우에만 사용해야합니다. 또한 System.Linq를 추가하고 배열 또는 목록에서 .AsEnumerable ()을 호출하는 것이 좋습니다.
— Mark

33

이제 추가하고 싶음을 지정 했으므로 원하는 것은 간단 IEnumerable<T>하지 않지만 최소한 ICollection<T>. 다음 List<T>과 같이 사용하는 것이 좋습니다 .

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

을 구현하기 IEnumerable<object>때문에 예상되는 모든 곳에서 myList를 사용할 수 있습니다 .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>은 IS 반복자 기능 C # 3에서 소개 :

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

IEnumerable<object> e4=MyIterator();


24

아니 IEnumerable인터페이스 이기 때문에 할 수 없습니다 .

를 구현하는 대부분의 비 인터페이스 유형의 빈 인스턴스를 만들 수 있어야합니다 IEnumerable. 예 :-

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

또는

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

@AdamRalph : 제가 반대표를 던진 후주의가 산만 해져서 즉시 댓글을 남길 수 없었습니다. 인터페이스는 유형이므로 일반적인 오해를 전파하기 때문에 귀하의 대답은 위험 할 정도로 잘못되었습니다.
— 제이슨


1

새 열거 가능한 개체 또는 목록을 만들고 여기에 추가 할 수 있기를 원했습니다.

이 주석은 모든 것을 변경합니다. 일반 IEnumerable<T>. 에서 인터페이스를 유지 System.Collections.Generic하려면 다음 ICollection<T>과 같이 구현하는 클래스를 사용해야합니다 List<T>.


1

주된 이유는 인터페이스의 객체를 생성 할 수없고 IEnumerable은 interface 입니다. 인터페이스를 구현하는 클래스의 객체를 생성해야합니다. 이것이 IEnumerable의 객체를 직접 생성 할 수없는 주된 이유입니다.


0

IEnumerable은 인터페이스가 아니므로 인터페이스 인스턴스를 만들 수 없습니다.

당신은 이렇게 할 수 있습니다

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

@Jon Skeet과 같은 COM 인터페이스의 인스턴스를 만들 수 있습니까?
— Arsen Mkrtchyan 2011 년


1
COM 인터페이스 용 인터페이스 대신 인스턴스화 된 기본 구현을 지정할 수 있다고 생각합니다.
— CodesInChaos 2011 년

@JonSkeet 호출 new SomeComInterface()하면 인터페이스 자체를 인스턴스화하는 것보다 인터페이스의 연관된 "CoClass"를 인스턴스화 한다고 말하는 것이 더 정확하지 않습니까?
— phoog

@phoog : 정확합니다.하지만 중요하고 이상한 점은 new특정 상황에서 인터페이스와 함께 사용할 수 있다는 것입니다 .
— Jon Skeet

0

다음과 같이 할 수 있습니다.

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.