Ну, в теория это правда. Фактически, в теории может быть поддержка больших массивов - см. Эту подпись Array.CreateInstance
, которая принимает значения long
для длин. Вы не смогли бы индексировать такой массив с помощью индексаторов C#, но вы могли бы использовать GetValue(long)
.
Однако, в практических условиях, я не верю, что любая реализация поддерживает такие огромные массивы. CLR имеет ограничение на объект, немного меньше 2 ГБ, поэтому даже байтовый массив не может фактически имеет 2147483648 элементов. Немного экспериментов показывает, что на моей коробке наибольший массив, который вы можете создать, - new byte[2147483591]
. (Это на 64-битной .NET CLR, в версии Mono у меня установлены дроссели.)
EDIT: просто глядя на спецификацию CLI, он указывает, что массивы имеют нижнюю границу и верхнюю границу Int32. Это означает, что верхние границы над Int32.MaxValue
запрещены, хотя они могут быть выражены с помощью вызовов Array.CreateInstance
. Тем не менее, это также означает, что допустимо иметь массив с границами Int32.MinValue...Int.MaxValue
, то есть 4294967296 элементов в общей сложности.
EDIT: Глядя снова, ECMA 335 раздела III раздела 4,20 (newarr
) указывает, что инициализация вектор типа с newarr
должен принимать либо значение native int
или int32
. Таким образом, это выглядит так, как обычно, более мягкий тип «массива» в терминологии CLI должен иметь границы int32
, «векторный» тип этого не делает.
Аналогичный вопрос/вопрос Dupey: http://stackoverflow.com/questions/1391672/what-is-the-maximum-size-that-an-array-can-hold – gideon
, если вы обнаружите, что вам нужен массив с более чем 2147483647 элементов, вам, вероятно, следует искать еще один алгоритм ... –