#c#
#c#
Вопрос:
У меня есть список целых чисел, который я буду использовать позже:
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);
}
}
Я получаю сообщение об ошибке «Индекс был вне диапазона».
Что я здесь делаю не так?
Комментарии:
1. если вам «нужно» сохранить этот дизайн (добавлять элементы в список только при создании экземпляра strms), то вы могли бы сделать это — int stream = Strms. _AList.ElementAtOrDefault(ItemNumber); который, если в потоке нет элемента, получит 0, потому что по умолчанию используется значение int.
Ответ №1:
Проблема:Ваш список не заполнен, поскольку вы заполняете его в общедоступном конструкторе, который будет вызван только при создании его экземпляра.
Решение:
Здесь у вас есть 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);
}
Ответ №2:
Вы добавляете элементы в статический список только при создании экземпляра Strms
класса. Таким образом, список, естественно, пуст, пока вы не создадите экземпляр.
Комментарии:
1. «Таким образом, список, естественно, пуст, пока вы не создадите экземпляр», вы имеете в виду, пока вы не добавите элементы? (список создается статическим ctor) 🙂
2. @terrybozzio — Список создается статическим конструктором, но элементы добавляются в список только при создании экземпляра класса.
Ответ №3:
У вас есть 2 конструктора, только нестатический вставляет элементы в список и не вызывается, пока вы не создадите его экземпляр. Либо создайте экземпляр, либо переместите этот код в статический конструктор.
Ответ №4:
Вам нужно инициализировать список в его определении, а не в конструкторе для класса, поскольку он статичен. Попробуйте использовать это определение вместо:
public static List<int> _AList = new List<int>{0,1,1,1};
и удаление кода из двух других методов.