Исключение 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.