Преобразование массива в IEnumerable

к моему удивлению, я получаю следующее заявление:

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

жаловаться на невозможность преобразования из

2 ответов


общие Array базовый класс не типизирован, поэтому он не реализует интерфейсы, специфичные для типа; однако,вектор можно бросить сразу-и GetValues фактически возвращает вектор; Итак:

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

или, возможно, проще:

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

Я думал, что последний наследует от первого.

Enum.GetValues возвращает Array, который реализует non-generic IEnumerable, поэтому вам нужно добавить бросок:

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

это работает с LINQ, потому что Cast<T> метод расширения определен для неродового IEnumerable интерфейс, а не только на IEnumerable<U>.

Edit: вызов ToList() избежать неэффективности, связанной с ходьбой несколько раз IEnumerable<T> производится методами LINQ с отложенным выполнением. Спасибо, Марк, за отличный комментарий!