Ошибка индекса: Индекс списка вне диапазона C#

    public void TheAnswerToKeyword(int index)
    {
        var target = targets[index];
        var fs = new FlooderSettings();

        if (fs.GetHistory(target, token) != "Ок")
        {
            dynamic json = JsonConvert.DeserializeObject(fs.GetHistory(target, token));
            var text = Convert.ToString(json["response"]["items"][0]["text"]);

Ответы (1 шт):

Автор решения: return

В C# Массивы имеют нижнюю и верхнюю границы. Нативно поддерживается нижняя граница в 0, верхняя задаётся программистом.

Пример:

var arr = new int[3];

Нижняя граница – 0, верхняя граница – 3. Количество элементов в массиве равно их разнице, т. е. 3-м. Индекс в данном случае может принимать значения в вот таком [0; 3) диапазоне. Если, в данном случае, будет выполняться данное условие для индекса index: index < 0 && index >= 3, то данный индекс будет считаться не действительным, т. к. выходит за границы массива.

Memory dump
        ↓            Границы массива           ↓
┌───┬───╥────────────┬────────────┬────────────╥───┬───┐
│ … │ … ║ Элемент #0 │ Элемент #1 │ Элемент #2 ║ … │ … │
└───┴───╨────────────┴────────────┴────────────╨───┴───┘

Исходя из вышесказанного, просто держите у себя в голове, что это выдаст ошибки run-time'а:

var arr = new int[3];
_ = arr[3]; // ошибка `IndexOutOfRangeException`

У вас 2 потенциально опасных места:

  • targets[index]
  • json["response"]["items"][0]

В 1-м случае мы не знаем размер массива и сам индекс, следовательно, вам нужно просто запустить вашу программу в режиме отладки (отладка в VS, отладка в VS Code) и узнать необходимые значения – дальше действуйте по ситуации.

Во 2-м случае вы, скорее всего, обращаетесь в массиву JSON. Раз вы не смогли обратиться к элементу под индексом 0, зн. границы массива выглядят так: [0; 0), т. е. Ø, т. е. ваш массив пустой. Проверьте во время той же отладки ваш JSON документ/фрагмент: возможно, массив, к которому вы обращаетесь, пустой.

Таким образом панацеей для таких ошибок является отладка – используйте, не пожалеете.

→ Ссылка