Подтвердить что ты не робот

Почему "длинный" разрешен как длина массива в С#?

Я хотел попытаться выделить массив из 4 миллиардов байт, и это мой код С#:

long size = 4 * 1000;
size *= 1000;
size *= 1000;
byte[] array = new byte[size];

этот код не работает с System.OverflowException в строке, содержащей new. Хорошо, получается Length возвращает int, поэтому длина массива также ограничена тем, что может хранить int.

Тогда почему нет ошибки времени компиляции и long разрешено использовать в качестве количества элементов массива при распределении?

4b9b3361

Ответ 1

Поскольку спецификация говорит так в разделе 7.6.10.4:

Каждое выражение в списке выражений должно иметь тип int, uint, long или ulong или неявно конвертируемый в один или несколько из этих типов.

Скорее всего, это позволит создать массивы размером более 2 ГБ, хотя они еще не поддерживаются (но без изменения языка после того, как CLR сделает такое изменение). Mono действительно поддерживает это, однако и .NET 4.5, по-видимому, позволит увеличить массивы.

Относительно длины массива, являющейся int, кстати: существует также LongLength, возвращая long. Это было в .NET 1.1 и, вероятно, изменение в будущем.

Ответ 2

почему долго разрешено в виде длины массива?

Ответ: long.net означает Int64

И индексирование массива может быть Int64 в соответствии со спецификацией.

Второй вопрос: почему отображается переполнение переполнения?

Поскольку для одного объекта не может быть выделено более 2 ГБ памяти.

Ответ 3

Это ограничение CLR, ни один объект не может превышать 2 ГБ, включая массивы:

Большой массив С# OutOfMemoryException

Это независимо от 32-разрядных или 64-разрядных ОС. Тем не менее, это не мешает вам использовать больше этой суммы в целом, просто не на одном объекте.

Это время выполнения, потому что если вы сохраните long (или другое значение инициализации) в пределах диапазона, он будет работать.

Вы можете инициализировать массивы со всеми интегральными типами: sbyte, char, short, int и long - все компилируются; также работают неподписанные варианты.

Ответ 4

long является интегральным типом, поэтому его можно использовать для определения массива; исключение - это создание слишком большого массива, а не только использование long.

Ex, это работает отлично:

long size = 20;
byte[] array = new byte[size];