Статический индекс списка int не работает должным образом

#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};
  

и удаление кода из двух других методов.