我有一份我将在稍后使用的整体列表:
public class Strms
{
public static List<int> _AList;
static Strms()
{
_AList = new List<int>();
}
public Strms()
{
_AList.Add(265);
_AList.Add(694);
_AList.Add(678);
_AList.Add(364);
}
}
但是当我尝试使用我刚创建的列表的索引时,在这里:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
var keys = new List<string>();
keys.Add("item1");
keys.Add("item2");
keys.Add("item3");
keys.Add("item4");
foreach (var item in keys.OfType<string>().Select((x, i) => new { x, i }))
{
int ItemNumber = item.i;
int stream = Strms._AList[ItemNumber];
Bass.BASS_ChannelPlay(stream, true);
MessageBox.Show(item.x);
}
}
我收到&#34;指数超出范围&#34;错误。
我在这里做错了什么?
答案 0 :(得分:2)
<强>问题:强> 您的列表未填充,因为您在公共构造函数中填充它,只有在您创建它的实例时才会调用它。
解决方案:
这里有3个解决方案
要么像这样更改静态构造函数
static Strms()
{
_AList = new List<int>();
_AList.Add(0);
_AList.Add(1);
_AList.Add(1);
_AList.Add(1);
}
或创建类strms的实例以调用公共构造函数。像
Strms s = new Strms();
在你的foreach循环之前,或一个公共静态方法来填充列表。像
public static void InitializeList()
{
_AList.Add(0);
_AList.Add(1);
_AList.Add(1);
_AList.Add(1);
}
答案 1 :(得分:1)
在创建Strms
类的实例时,您只是将项添加到静态列表中。因此,在创建实例之前,列表自然是空的。
答案 2 :(得分:0)
您有2个构造函数,只有非静态构造函数将项目插入到列表中,除非您创建它的实例,否则不会调用它们。创建一个实例或将该代码移动到静态构造函数中。
答案 3 :(得分:0)
您需要在其定义中初始化列表,而不是在类的构造函数中,因为它是静态的。请尝试使用此定义:
public static List<int> _AList = new List<int>{0,1,1,1};
并从其他两种方法中删除代码。