IEnumerable 到List

好的,我四处寻找,找不到答案。 我有一个方法返回一个

IEnumerable 

调用方法是将方法的结果存储在

 List 

但是我收到以下错误。

 System.Collections.Generic.IEnumerable to System.Collections.Generic.List. An explicit conversion exists (are you missing a cast?) 

我在msdn上看了

 IEnumerable interface and List class. 

以下行来自msdn。

 public class List : IList, ICollection, IEnumerable, IList, ICollection, IEnumerable 

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

 IEnumerable to List. 

有人可以向我解释一下。 我错过了什么

并非所有IEnumerable都是List 。 反之亦然。

您可以尝试转换为List ,这是不好的做法,如果它确实不是列表可能会失败,或者您可以从枚举中创建新列表

 new List(yourEnumerable); 

或使用Linq

 yourEnumerable.ToList(); 

List实现IEnumerable – 你是对的。 但这意味着你可以隐式地将List转换为IEnumerable而不是相反。 要解决您的问题,只需调用IEnumerable上的ToList()将其转换为List

IEnumerableList但不一定是一个。 您可以使用LINQ的IEnumerable.ToList()将任何IEnumerable转换为List

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

您可以调用ToListIEnumerable转换为List

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

这不会自动发生,因为尽管您可以尝试将IEnumerable向下转换为List

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

没有隐式转换运算符,因此C#编译器不允许在没有强制转换的情况下进行赋值。 向下转换可能在运行时失败,因此在大多数情况下最好使用ToList

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

公开枚举器,它支持对非generics集合的简单迭代。

所有IEnumerable都承诺你可以获得下一个元素。 List承诺更多:例如通过索引进行访问并将其作为有限长度。

IEnumerable不是这种情况。 例如,下面的代码实际上并没有创建列表,实际上,您无法从中创建列表。 每次你要求一个新的元素,它会给你一个。 但它只在被问到时计算它。 :

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

您想要调用ToList来获取列表。 请注意,这可能会在上述情况下终止。

我们不能通过变量赋值将较少派生的类型分配给更多派生类型。 多数民众赞成不安全。

在语言规范中。 说, ListIEnumerable赋值不兼容。 但是,反过来是正确的。 IEnumerableList赋值兼容。

如果将赋值兼容性可视化为关系,则更有意义。 如果x <= y为真,则x> = y不为真(除非y = x)。 (具体来说,2 <3 =真,所以2> 3不成立。)

在您的情况下,我们可以将汽车列表的值分配给IEnumerable类型的变量。

如果我们可以将关系表示为

List <= IEnumerable = true。

然后就是这样

List = IEnumerable = false

这是错误的,因为我们知道的第一个关系是真的。