簡體   English   中英

IEnumerable的 <T> 列表 <T>

[英]IEnumerable<T> to List<T>

好的,我四處尋找,找不到答案。 我有一個返回的方法

IEnumerable<ICar> 

調用方法是將方法的結果存儲在

List<ICar> 

但是我收到以下錯誤。

System.Collections.Generic.IEnumerable<Test.Interfaces.ICar> to 
System.Collections.Generic.List<Test.Interfaces.ICar>. An explicit conversion exists   
(are you missing a cast?)   

我看了msdn at

IEnumerable<T> interface and List<T> class. 

以下行來自msdn。

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection,   
IEnumerable

我只是不明白為什么我不能分配

IEnumerable<ICar> to List<ICar>. 

有人可以向我解釋一下。 我錯過了什么

並非所有IEnumerable<T>都是List<T> 反之亦然。

您可以嘗試強制轉換為List<T> ,這是不好的做法,如果它確實不是列表可能會失敗,或者您可以從枚舉中創建新列表

new List<T>(yourEnumerable);

或使用Linq

yourEnumerable.ToList();

List<ICar>實現IEnumerable<ICar> - 你是對的。 但這意味着你可以隱式地將List<ICar>轉換為IEnumerable<ICar> - 而不是相反。 要解決您的問題,只需調用IEnumerable上的ToList()將其轉換為List

您可以調用ToListIEnumerable<Car>轉換為List<Car>

IEnumerable<ICar> cars = ...;
List<ICar> list = cars.ToList(); // OK

這不會自動發生,因為盡管您可以嘗試將IEnumerable<Car>向下轉換為List<Car>

IEnumerable<ICar> cars = ...;
List<ICar> list = (List<ICar>)cars; // Compiles, but could fail at runtime.

沒有隱式轉換運算符,因此C#編譯器不允許在沒有強制轉換的情況下進行賦值。 向下轉換可能在運行時失敗,因此在大多數情況下最好使用ToList

IEnumerable<T>List<T>但不一定是一個。 您可以使用LINQ的IEnumerable<T>.ToList<T>()將任何IEnumerable<T>轉換為List<T>

IEnumerable<T> foo = ThatMethodYouWereTalkingAbout();
List<T> bar;
if (foo is List<T>)
    bar = (List<T>)foo;
} else {
    bar = new List<T>(foo);
}

所有列表都是IEnumerable,但是所有的Innumerable都不是列表。 根據MSDN IEnumerable

公開枚舉器,它支持對非泛型集合的簡單迭代。

所有IEnumerable都承諾你可以獲得下一個元素。 List承諾更多:例如通過索引訪問並將其作為有限長度。

IEnumerable不是這種情況。 例如,下面的代碼實際上並沒有創建列表,實際上,您無法從中創建列表。 每次你要求一個新的元素,它會給你一個。 但它只在被問到時計算它。

IEnumerable<int> Numbers() {
    int i=0;
    while(true) {
        yield return unchecked(i++);
    }
}

您想要調用ToList來獲取列表。 請注意,這可能會在上述情況下終止。

我們不能通過變量賦值將較少派生的類型分配給更多派生類型。 多數民眾贊成不安全。

在語言規范中。 說, List<ICar>IEnumerable<ICar>賦值不兼容。 但是,反過來是正確的。 IEnumerable<ICar>List<ICar>兼容。

如果將賦值兼容性可視化為關系,則更有意義。 如果x <= y為真,則x> = y不為真(除非y = x)。 (具體來說,2 <3 =真,所以2> 3不成立。)

在您的情況下,我們可以將汽車列表的值分配給IEnumerable<ICar>類型的變量。

如果我們能把這種關系表示為

List<ICar> <= IEnumerable<ICar> = true。

然后就是這樣

List<ICar> = IEnumerable<ICar> = false

這是錯誤的,因為我們知道的第一個關系是真的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM