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.