2011-08-24 100 views
64

假設你有一個基本的Employee類這樣:鑄造陣列的IEnumerable <T>

class Employee 
{ 
    public string Name; 
    public int Years; 
    public string Department; 
} 

然後(在一個單獨的類)我有下面的代碼片段(我想我明白所有,但最後一個):

我相信下面的代碼片段的工作原理是因爲數組initiliser創建了一個Employee對象的數組,它與被分配給的勞動力變量的類型相同。

Employee[] workforceOne = new Employee[] { 
    new Employee() { Name = "David", Years = 0, Department = "software" }, 
    new Employee() { Name = "Dexter", Years = 3, Department = "software" }, 
    new Employee() { Name = "Paul", Years = 4, Department = "software" } }; 

然後我有下面的代碼片段。我相信這是有效的,因爲Employee對象隱含數組是實現IEnumerable的Array()類的實現。因此,我相信這就是爲什麼數組可以分配給IEnumerable?

IEnumerable workforceTwo = new Employee[] { 
    new Employee() { Name = "David", Years = 0, Department = "software" }, 
    new Employee() { Name = "Dexter", Years = 3, Department = "software" }, 
    new Employee() { Name = "Paul", Years = 4, Department = "software" } }; 

然後,我有這樣的代碼片段:

IEnumerable<Employee> workforceThree = new Employee[] { 
    new Employee() { Name = "David", Years = 0, Department = "software" }, 
    new Employee() { Name = "Dexter", Years = 3, Department = "software" }, 
    new Employee() { Name = "Paul", Years = 4, Department = "software" } }; 

我不知道爲什麼這個代碼片段的作品?從IEnumerableIEnumerable<Employee>繼承(α和覆蓋(或過載)的GetEnumerator()方法),但不應因此,我需要用於上述的鑄造這樣的工作:

//The cast does work but is not required 
IEnumerable<Employee> workforceFour = (IEnumerable<Employee>)new Employee[] { 
    new Employee() { Name = "David", Years = 0, Department = "software" }, 
    new Employee() { Name = "Dexter", Years = 3, Department = "software" }, 
    new Employee() { Name = "Paul", Years = 4, Department = "software" } }; 

似乎陣列正被隱式地向下從IEnumerable類型投射到IEnumerable<Employee>,但我一直認爲,當您需要將類型轉換爲更具體的類型時,您需要進行明確的投射。

也許我在我的理解中錯過了一些簡單的東西,但是有人可以幫我理解這個。

謝謝。

+0

這裏有什麼問題? – Aliostad

+3

@Aliostad:它位於'workforceThree'片段的正下方。 – Heinzi

+3

+1好問題! – Gishu

回答

93

the documentation

在.NET Framework 2.0版,Array類實現System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>,和System.Collections.Generic.IEnumerable<T>通用接口。這些實現在運行時提供給數組,因此對文檔構建工具不可見。因此,通用接口不會出現在Array類的聲明語法中,並且只有通過將數組轉換爲通用接口類型(顯式接口實現)才能訪問的接口成員沒有參考主題。

因此,您的Employee[]執行IEnumerable<Employee>

+3

爲了澄清,它不是Array類實現它,它是T []任何T. [ – IllidanS4

4

需要員工的默認工具IEnumerable<Employee>以及IEnumerable

3

明確的轉換數組的時候有些句子必須downcasted。這就是將一個對象轉換爲更專用的類型 - 如果對象是這種特殊類型的 - 。

另一方面,upcasting(鑄造到一個不太專業化的類型),永遠不會需要一個明確的演員,但你可以明確地做到這一點(這只是無用的)。

,數組實現IEnumerableIEnumerable<T>,你做你的代碼的上溯造型,意思_you並不需要顯式轉換爲IEnumerable<T>

+3

]我不同意。在某些情況下,您需要明確的上傳。作爲一個示例功能控制裝置: 空隙DoStuffs(IEnumerable的對象){...} 空隙DoStuffs(PARAMS T []對象){DoStuffs((IEnumerable的)對象); } – Orace

+2

@Orace這不完全是一個upcast ...這是一個編譯器的幫助,讓它調用期望的過載...你同意嗎? ;)這是一個重載方法問題。 –

+0

@Orace嗯,這是一個upcast,但我的意思是,你需要明確的「鑄」來調用所需的重載... –