У меня есть следующее перечисление:
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);
Однако я всегда получаю следующее исключение:
Ссылка на объект не набор к экземпляру объекта.
Как я могу правильно выполнить это?
Как уже отмечалось в других ответах, проблема заключается в том, что вы объявили список, но не создали его, поэтому при попытке добавить элементы вы получаете NullReferenceException
.
Обратите внимание, что если вы хотите создать новый список, вы можете использовать более лаконичный синтаксис инициализатора коллекции:
List<SymbolWejsciowy> symbols = new List<SymbolWejsciowy>
{
SymbolWejsciowy.K1,
SymbolWejsciowy.K2,
// ...
};
Если вам нужен список, содержащий все значения, вы можете получить его, вызвав Enum.GetValues
:
List<SymbolWejsciowy> symbols = Enum.GetValues(typeof(SymbolWejsciowy))
.Cast<SymbolWejsciowy>()
.ToList();
В вашем варианте 1 экземпляр SymbolWejsciowy и ваш список имеют одинаковое имя, я полагаю, что это опечатка.
Не принимая это во внимание, я бы сказал, что вы не создали экземпляр списка
symbol = new List<SymbolWejsciowy>();
Ваш код никогда не инициализирует список. Try this:
public List<SymbolWejsciowy> symbol = new List<SymbolWejsciowy>();
symbol.Add(SymbolWejsciowy.K1);
and
SymbolWejsciowy mySymbol= SymbolWejsciowy.K2;
symbol.Add(mySymbol);
Было бы неплохо, если бы 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
.)