我有以下枚举:
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);
但是,我总是得到以下例外:
对象引用未设置为对象的实例。
我怎样才能正确地完成这个?
答案 0 :(得分:17)
正如其他答案已经指出的那样,问题是您已经声明了一个列表,但是您还没有构建一个列表,因此当您尝试添加元素时,您会得到一个NullReferenceException
。
请注意,如果您想构建一个新列表,可以使用更简洁的collection initializer syntax:
List<SymbolWejsciowy> symbols = new List<SymbolWejsciowy>
{
SymbolWejsciowy.K1,
SymbolWejsciowy.K2,
// ...
};
如果您想要一个包含所有值的列表,那么您可以通过调用Enum.GetValues
:
List<SymbolWejsciowy> symbols = Enum.GetValues(typeof(SymbolWejsciowy))
.Cast<SymbolWejsciowy>()
.ToList();
答案 1 :(得分:3)
在您的选项中,1个SymbolWejsciowy实例和您的列表具有相同的名称,我想这是一个拼写错误。
如果不考虑这一点,我会说你没有创建列表实例
symbol = new List<SymbolWejsciowy>();
答案 2 :(得分:2)
您的代码从不初始化列表。试试这个:
public List<SymbolWejsciowy> symbol = new List<SymbolWejsciowy>();
symbol.Add(SymbolWejsciowy.K1);
和
SymbolWejsciowy mySymbol= SymbolWejsciowy.K2;
symbol.Add(mySymbol);
答案 3 :(得分:0)
如果{C} 2.0中的Enum.GetValues()
已更新为泛型,那肯定会很好。好吧,我猜我们必须自己写一下:
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
。)