2013-02-25 61 views
8

我有一個轉換列表類型到IEnumerable接口類型

List<Person> personlist; 

我怎麼能轉換成

IEnumerable<IPerson> iPersonList 

人用工具IPerson接口

+3

'名單'是一個'IEnumerable的'。 – 2013-02-25 16:41:46

+0

patrickinmpls你最終想要做什麼..?你可以嘗試查找'Cast'擴展方法 – MethodMan 2013-02-25 16:42:51

回答

22

如果你在.NET 4.0或更高版本的時候,你可以做隱式轉換:

IEnumerable<IPerson> iPersonList = personlist; 
//or explicit: 
var iPersonList = (IEnumerable<IPerson>)personlist; 

這將使用通用逆變在IEnumerable<out T> - 即因爲你永遠只能得到一些IEnumerable,你可以如果T : U含蓄地將IEnumerable<T>轉換爲IEnumerable<U>。 (它也使用了List<T> : IEnumerable<T>

否則,您必須使用LINQ投每個項目:

var iPersonList = personlist.Cast<IPerson>(); 
+0

將正常的顯式轉換語法工作嗎?例如:(IEnumerable )personList?如果是/否,那爲什麼? – Freeman 2013-02-25 16:45:33

+0

@Freeman我添加了一些解釋。 (它對C#/ .NET來說是比較新的。) – Rawling 2013-02-25 16:46:03

+0

謝謝,我現在明白了。 – Freeman 2013-02-25 16:47:16

4

可以使用IEnumerable.Cast

var iPersonList = personlist.Cast<IPerson>(); 
+0

@ManishSingh你必須添加'using System.Linq;' – juharr 2016-12-08 12:39:06

0

由於.NET 4.0中,你可以通過List<Person>的方法與IEnumerable<IPerson>類型的無隱含參數或明確的鑄造。

隱式轉換是自動完成(如果可能的話),這要歸功於contravariance

你可以這樣做:

var people = new List<Person>(); 
// Add items to the list 

ProcessPeople(people); // No casting required, implicit cast is done behind the scenes 


private void ProcessPeople(IEnumerable<IPerson> people) 
{ 
// Processing comes here 
}