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
。
IEnumerable
是List
但不一定是一个。 您可以使用LINQ的IEnumerable
将任何IEnumerable
转换为List
IEnumerable foo = ThatMethodYouWereTalkingAbout(); List bar; if (foo is List ) bar = (List )foo; } else { bar = new List (foo); }
您可以调用ToList
将IEnumerable
转换为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来获取列表。 请注意,这可能会在上述情况下终止。
我们不能通过变量赋值将较少派生的类型分配给更多派生类型。 多数民众赞成不安全。
在语言规范中。 说, List
与IEnumerable
赋值不兼容。 但是,反过来是正确的。 IEnumerable
与List
赋值兼容。
如果将赋值兼容性可视化为关系,则更有意义。 如果x <= y为真,则x> = y不为真(除非y = x)。 (具体来说,2 <3 =真,所以2> 3不成立。)
在您的情况下,我们可以将汽车列表的值分配给IEnumerable
类型的变量。
如果我们可以将关系表示为
List
<= IEnumerable
= true。
然后就是这样
List
= IEnumerable
= false
这是错误的,因为我们知道的第一个关系是真的。
上述就是C#学习教程:IEnumerable 到List分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1021796.html