2016-09-25 4 views
0

나는 C#을 배우고 있으며 객체 컬렉션을 만들고 싶습니다. 다음과 같은 이상한 행동을 발견했습니다.왜 var 목록 <MyObject>(); 작업 및 var IEnumerable <MyObject>(); 작동하지?

var abc = new List<MyObject>(); 

... 작업과

var xyz = new IEnumerable<MyObject>(); 

... 작동하지합니까?

후자는 오류가 발생합니다 :

Cannot create an instance of the abstract class or interface.

을 그리고 네,이 모든 Google을 통해 내가 많이 읽고 - 매우 복잡한 - 내가 완전히 이해하지 않는 설명을.

사실 전작과 후자는 흥미 롭지 않습니다. 누군가가이 두 가지를 설명 할 수 있다면 유용 할 거라고 생각합니다 - 분명히 비슷한 - 진술서와 왜 하나가 작동하지 않는가?

+0

목록은 C#에서 IEnumerable을 – Haris

+1

_not 작업을 구현 어디서나 – Fabio

+0

는 "C#에서"제거 – niico

답변

5

IEnumerable은 의미 론적으로나 근본적으로 클래스와 다른 인터페이스입니다.

인터페이스는 클래스가 해당 클래스의 인스턴스에 대한 "템플릿"과 같은 방식으로 클래스의 "템플릿"과 유사합니다.

인터페이스 자체가 실제로 아무 것도하지 않기 때문에 인터페이스를 인스턴스화 할 수 없습니다. 당신은 확실히 할 수있는 다음 List 클래스는 IEnumerable 인터페이스를 구현하기 때문에

IEnumerable<MyObject> xyz = new List<MyObject>();

이입니다. 인터페이스는 공통 클래스를 서로 강제로 그룹화하지 않고 강제로 그룹화하는 데 사용됩니다.

편집 : 질문과 관련하여 그들은 동일하지 않습니다. 인터페이스가 구현하는 메소드로 제한됩니다. List이 구현하는 방법을 사용하려면 해당 개체를 List<MyObject>으로 전송해야합니다.

더 읽기 : C# Interfaces

+0

감사 편집 _not 작업 - 그래서 IEnumerable을 XYZ = 새로운 목록 을();? - 목록과 기능적/효과적입니다. xyz = new List (); – niico

+1

@niico 편집을 참조하십시오. –

+0

나는 이것에 더 가깝다. 관련 질문 -이 작동 왜 (Dapper) var MyObjColl = connection.Query (sql); - MyObjColl은 다음과 같습니다. (로컬 변수) IEnumerable MyObjColl. 만약 이것이 IEnumerable 타입의 객체가 아니라면 어떤 타입입니까? & dapper를 사용하여 var를 사용하지 않고 어떻게 별도로 생성합니까? (var MyObjColl = new IEnumerable IEnumerable <>이 인터페이스이기 때문에 분명히 작동하지 않습니다. – niico

관련 문제