2016-09-25 102 views
0

我正在學習c#,並想創建一個對象集合,我注意到下面的奇怪行爲。爲什麼var List <MyObject>();工作和var IEnumerable <MyObject>();不行?

爲什麼

var abc = new List<MyObject>(); 

...工作和

var xyz = new IEnumerable<MyObject>(); 

...不行?

後者引發錯誤:

Cannot create an instance of the abstract class or interface.

是的,這是全國各地谷歌和我看了很多 - 非常複雜 - 的解釋,我不完全掌握。

事實上前人的工作和後者沒有有趣的是,我認爲這將是有用的,如果有人能解釋這個對比兩種 - 明顯相似的 - 陳述爲什麼一個作品和一個不?

+0

名單C#實現IEnumerable – Haris

+1

_not工作_not工作隨時隨地 – Fabio

+0

編輯爲 「在C#中」 刪除 – niico

回答

5

IEnumerable是這既是語義和不是類根本不同的接口。

接口是像一個「模板」以同樣的方式,一類是像一個「模板」這個類的一個實例的類。

因爲本身的接口實際上並沒有做任何事情,你不能實例化一個接口。你當然可以這樣做:

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

這是因爲List類實現IEnumerable接口。接口用於將公共類組合在一起,而不會強迫它們互相推in。

編輯: 關於你的問題,他們是不一樣的,沒有。您將自己限制爲接口實現的方法。您需要將該對象投射到List<MyObject>才能使用List實現的方法。

瞭解更多: C# Interfaces

+0

謝謝 - 這樣的IEnumerable XYZ =新名單();? - 在功能上/實際上與清單 xyz =新清單();? – niico

+1

@niico查看我的編輯。 –

+0

我更接近理解這一點。相關問題 - 爲什麼這個工作(在Dapper)var MyObjColl = connection.Query (sql); - MyObjColl是:(本地變量)IEnumerable MyObjColl。如果這不是IEnumerable <>類型的對象,那麼它是什麼類型,以及如何在不使用var和dapper的情況下單獨創建它? (var MyObjColl = new IEnumerable 顯然不起作用,因爲IEnumerable <>是一個接口。 – niico

相關問題