Kon*_*ten 11 c# arrays ienumerable casting type-conversion
令我惊讶的是,我得到以下声明:
public static IEnumerable<SomeType> AllEnums
=> Enum.GetValues(typeof(SomeType));
Run Code Online (Sandbox Code Playgroud)
抱怨无法从System.Array转换为System.Collection.Generic.IEnumerable.我以为后者继承了前者.显然我错了.
因为我不能LINQ它或.ToList它,我不知道如何妥善处理它.我宁愿避免显式转换,因为它是枚举的一堆值,我不认为SomeType -ing它会有很多用处,也不会.
Mar*_*ell 18
一般Array
基类没有输入,因此它不实现任何特定于类型的接口; 但是,矢量可以直接投射 - GetValues
实际上返回一个矢量; 所以:
public static IEnumerable<SomeType> AllEnums
= (SomeType[])Enum.GetValues(typeof(SomeType));
Run Code Online (Sandbox Code Playgroud)
或者更简单:
public static SomeType[] AllEnums
= (SomeType[])Enum.GetValues(typeof(SomeType));
Run Code Online (Sandbox Code Playgroud)
我认为后者继承了前者。
Enum.GetValues
returns Array
,它实现了非泛型IEnumerable
,所以你需要添加一个强制转换:
public static IEnumerable<SomeType> AllEnums = Enum.GetValues(typeof(SomeType))
.Cast<SomeType>()
.ToList();
Run Code Online (Sandbox Code Playgroud)
这适用于 LINQ,因为Cast<T>
扩展方法是为非通用IEnumerable
接口定义的,而不仅仅是在IEnumerable<U>
.
编辑:ToList()
避免与多次行走相关的低效率调用,IEnumerable<T>
并由具有延迟执行的 LINQ 方法生成。谢谢马克的精彩评论!