Исключение ArgumentOutOfRangeException с текстом «Длина не может быть меньше нуля. Имя параметра: length» возникает в .NET-приложениях, когда в метод Substring или аналогичную строковую операцию передаётся отрицательное значение длины. Чаще всего виновник — выражение вида str.Substring(0, str.IndexOf(ch)), где символ-разделитель в строке не найден, и IndexOf возвращает -1.

Ошибка проявляется внезапно: код может месяцами работать на «правильных» данных и упасть на первой же строке, где ожидаемый разделитель отсутствует. Ниже разберём, как локализовать проблемное место, какие сценарии приводят к отрицательной длине и как исправить код без костылей.

Что означает это исключение

Сообщение «Length cannot be less than zero. Parameter name: length» — это локализованный текст исключения ArgumentOutOfRangeException, которое .NET выбрасывает при передаче недопустимого аргумента. Имя параметра length указывает, что отрицательным оказался именно аргумент длины, а не стартовый индекс.

Типичные методы, где возникает эта ошибка:

  • 🔧 String.Substring(startIndex, length) — самый частый источник;
  • 📏 String.Remove(startIndex, count) при отрицательном count;
  • ✂️ Конструкторы и методы работы с массивами, принимающие длину сегмента;
  • 📂 Пользовательские методы, внутри которых вызывается одна из перечисленных операций.

Обратите внимание: исключение выбрасывается в момент вызова метода, поэтому в трассировке стека всегда видно точную строку кода, где произошёл сбой.

Классический сценарий: Substring вместе с IndexOf

Самая распространённая причина — комбинация IndexOf и Substring без проверки результата поиска. Метод IndexOf возвращает -1, если подстрока не найдена, и это значение напрямую попадает в параметр длины.

string line = "ключ=значение";

int pos = line.IndexOf('=');

string key = line.Substring(0, pos); // упадёт, если '=' нет

Если в line нет символа =, переменная pos станет равна -1, и вызов Substring(0, -1) выбросит именно то исключение, которое вы видите. Такое случается при разборе конфигурационных файлов, CSV-строк, ответов внешних сервисов и пользовательского ввода — везде, где формат данных не гарантирован.

💡

Ошибка «длина не может быть меньше нуля» почти всегда означает, что IndexOf или LastIndexOf вернул -1, а результат не был проверен перед передачей в Substring.