Как добавить, что перечисление оценивает списку

У меня есть следующее перечисление:

public enum SymbolWejsciowy
{
     K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 
}

Я хочу создать список с помощью значений этого перечисления:

 public List<SymbolWejsciowy> symbol;

Я попробовал пару различных способов добавить, что перечисление оценивает списку:

SymbolWejsciowy symbol;  
symbol.Add(symbol = SymbolWejsciowy.K1); 

и

symbol.Add(SymbolWejsciowy.K1); 

Однако я всегда получаю следующее исключение:

Ссылка на объект не набор к экземпляру объекта.

Как я могу правильно выполнить это?

14
задан knueser 26 July 2018 в 21:30
поделиться

4 ответа

Как уже отмечалось в других ответах, проблема заключается в том, что вы объявили список, но не создали его, поэтому при попытке добавить элементы вы получаете NullReferenceException.

Обратите внимание, что если вы хотите создать новый список, вы можете использовать более лаконичный синтаксис инициализатора коллекции:

List<SymbolWejsciowy> symbols = new List<SymbolWejsciowy> 
{
    SymbolWejsciowy.K1,
    SymbolWejsciowy.K2,
    // ...
};

Если вам нужен список, содержащий все значения, вы можете получить его, вызвав Enum.GetValues:

List<SymbolWejsciowy> symbols = Enum.GetValues(typeof(SymbolWejsciowy))
                                    .Cast<SymbolWejsciowy>()
                                    .ToList();
18
ответ дан 1 December 2019 в 12:26
поделиться

В вашем варианте 1 экземпляр SymbolWejsciowy и ваш список имеют одинаковое имя, я полагаю, что это опечатка.

Не принимая это во внимание, я бы сказал, что вы не создали экземпляр списка

symbol = new List<SymbolWejsciowy>();
3
ответ дан 1 December 2019 в 12:26
поделиться

Ваш код никогда не инициализирует список. Try this:

public List<SymbolWejsciowy> symbol = new List<SymbolWejsciowy>();
symbol.Add(SymbolWejsciowy.K1);

and

SymbolWejsciowy mySymbol= SymbolWejsciowy.K2;
symbol.Add(mySymbol);
2
ответ дан 1 December 2019 в 12:26
поделиться

Было бы неплохо, если бы Enum.GetValues() был обновлен для generics еще в C# 2.0. Что ж, придется писать самим:

static class EnumHelpers<T> where T : struct
{
    public class NotAnEnumException : Exception
    {
        public NotAnEnumException() : base(string.Format(@"Type ""{0}"" is not an Enum type.", typeof(T))) { }
    }

    static EnumHelpers()
    {
        if (typeof(T).BaseType != typeof(Enum)) throw new NotAnEnumException();
    }

    public static IEnumerable<T> GetValues()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }

    public static T Parse(string value)
    {
        return (T)Enum.Parse(typeof(T), value);
    }
}

Я включил Parse(), потому что он точно так же выигрывает от дженериков.

Использование:

        var symbols = EnumHelpers<SymbolWejsciowy>.GetValues().ToList();

        SymbolWejsciowy s = EnumHelpers<SymbolWejsciowy>.Parse("S2");

(ASIDE: Я также хотел бы, чтобы вы могли написать where T : enum для подобных вещей. Также, where T : delegate.)

.
0
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: