Что будет, если превысить int в количестве элементов List в C#?
Что проверяют
Знаете ли вы внутреннее устройство List<T> и ограничения среды, а не только диапазон int. Ответ про два миллиарда и точку показывает, что человек не открывал реализацию и не работал с большими объёмами.
Как отвечать
Столько элементов вы просто не добавите. Внутри List<T> лежит обычный массив, а Count и Capacity имеют тип int, поэтому потолок по определению не выше int.MaxValue. Фактический потолок ещё ниже: длина массива ограничена значением Array.MaxLength, которое чуть меньше максимума int, и попытка вырасти дальше приводит к OutOfMemoryException.
До этой границы почти никто не доходит, потому что раньше кончается память:
- список растит ёмкость удвоением, и в момент роста в памяти лежат оба массива, старый и новый, то есть пик потребления примерно втрое больше полезных данных;
- массив крупнее восьмидесяти с лишним килобайт попадает в кучу больших объектов, которая по умолчанию не уплотняется, и появляется фрагментация;
- один объект больше двух гигабайт требует явно включённой поддержки очень больших объектов, а список из двух миллиардов чисел это восемь гигабайт.
Практический вывод: такие объёмы не держат в одной коллекции. Потоковая обработка через IEnumerable<T> и IAsyncEnumerable<T>, разбиение на части, ArrayPool<T>, отображение файла в память или база данных.
Где спотыкаются
Отвечают, что счётчик переполнится и Count станет отрицательным. Переполнения не происходит: до него дело не доходит, исключение прилетит раньше, при попытке выделить новый массив.
Второе: ловят OutOfMemoryException и продолжают работу как ни в чём не бывало. Память от перехвата не появляется, а состояние процесса после такого исключения непредсказуемо, и единственный разумный сценарий это аккуратно завершиться.
Третье: говорят только про предел типа и молчат про ёмкость. Заданная в конструкторе ёмкость убирает серию перевыделений и копирований, и это ровно то, что спросят следующим вопросом.