将数组转换为 IEnumerable<T>

Converting Array to IEnumerable<T>

令我惊讶的是,我得到以下声明:

public static IEnumerable<SomeType> AllEnums 
  => Enum.GetValues(typeof(SomeType));

抱怨无法从System.Array转换为System.Collection.Generic.IEnumerable。我认为后者是从前者继承而来的。看来我错了。

由于我无法对其进行 LINQ 或 .ToList,因此我不确定如何正确处理它。我宁愿避免显式转换,因为它是 enum 的一堆值,我不认为 as SomeType-ing 它会也没什么用。

I thought that the latter was inheriting from the former.

Enum.GetValuesreturnsArray,实现了非泛型IEnumerable,所以需要加一个强制转换:

public static IEnumerable<SomeType> AllEnums = Enum.GetValues(typeof(SomeType))
    .Cast<SomeType>()
    .ToList(); 

这适用于 LINQ,因为 Cast<T> 扩展方法是为非通用 IEnumerable 接口定义的,而不仅仅是 IEnumerable<U>.

编辑: ToList() 的调用避免了与多次行走相关的低效率和延迟执行的 LINQ 方法产生的 IEnumerable<T>。谢谢 Marc 的精彩评论!

通用Array基class没有类型,所以它没有实现任何类型特定的接口;但是,vector 可以直接转换 - 而 GetValues 实际上 returns 一个向量;所以:

public static IEnumerable<SomeType> AllEnums
    = (SomeType[])Enum.GetValues(typeof(SomeType));

或者更简单:

public static SomeType[] AllEnums 
    = (SomeType[])Enum.GetValues(typeof(SomeType));