Преобразование массива в 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 с отложенным выполнением. Спасибо, Марк, за отличный комментарий!