2016-09-25 1 views
0

Ich lerne C# und möchte eine Sammlung von Objekten erstellen und ich bemerkte das folgende seltsame Verhalten.Warum ist die Var-Liste <MyObject>(); arbeiten und var IEnumerable <MyObject>(); nicht arbeiten?

Warum

var abc = new List<MyObject>(); 

... Arbeit und

var xyz = new IEnumerable<MyObject>(); 

... nicht?

Letzteres wirft den Fehler:

Cannot create an instance of the abstract class or interface.

Und ja das ist alles über Google und ich habe viele gelesen - sehr komplex - Erklärungen, die ich nicht begreifen voll.

Die Tatsache, dass ersteres funktioniert und letzteres nicht, ist interessant und ich denke, es wäre nützlich, wenn jemand dies im Gegensatz zu den beiden - scheinbar ähnlichen - Aussagen erklären könnte und warum man arbeitet und man nicht?

+0

Liste implementiert IEnumerable – Haris

+1

_not Arbeit in C# _not Arbeit überall – Fabio

+0

bearbeitet entfernen "in C#" – niico

Antwort

5

IEnumerable ist eine Schnittstelle, die sowohl semantisch als auch grundlegend anders als eine Klasse ist.

Eine Schnittstelle ist wie eine "Vorlage" für eine Klasse auf dieselbe Weise wie eine Klasse wie eine "Vorlage" für eine Instanz dieser Klasse.

Sie können eine Schnittstelle nicht instanziieren, da eine Schnittstelle an sich nichts bewirkt. Man könnte sicherlich tun:

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

Dies liegt daran, die List Klasse den IEnumerable-Schnittstelle implementiert. Schnittstellen werden verwendet, um gemeinsame Klassen zu gruppieren, ohne sie voneinander zu unterscheiden.

EDIT: In Bezug auf Ihre Frage, sie sind nicht die gleichen, nein. Sie beschränken sich auf die Methoden, die die Schnittstelle implementiert. Sie müssten dieses Objekt in ein List<MyObject> umwandeln, um die Methoden verwenden zu können, die List implementiert.

mehr lesen: C# Interfaces

+0

Dank - so IEnumerable xyz = new List (); - ist funktional/effektiv identisch mit Liste xyz = neue Liste () ;? – niico

+1

@niico Siehe meine Änderungen. –

+0

Ich bin näher daran, dies zu verstehen. Verwandte Frage - warum funktioniert das (in Dapper) var MyObjColl = connection.Query (sql); - MyObjColl ist: (lokale Variable) IEnumerable MyObjColl. Wenn dies kein Objekt vom Typ IEnumerable <> ist, welcher Typ ist es und wie erstelle ich es separat, ohne var mit Dapper zu verwenden? (var MyObjColl = new IEnumerable funktioniert offensichtlich nicht, da IEnumerable <> eine Schnittstelle ist. – niico

Verwandte Themen