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