Desde MSDN
El tamaño de la matriz está limitado a un total de 4 mil millones de elementos y a un índice máximo de 0x7FEFFFFF en cualquier dimensión dada (0x7FFFFFC7 para matrices de bytes y matrices de estructuras de un solo byte).
¿Por qué estos números y no otros?
Es decir, no son parejos, ni maxint ni nada por el estilo. ¿Para qué sirve la pieza "cortada"? (0x7F_E_FFFFF = 0x7FFFFFFF - 0x100000 o, para matrices de bytes, 0x7FFFFF_C7 = 0x7FFFFFF_FF - 0x38)
--- editado ---
En la pregunta relacionada ( ¿Por qué el tamaño máximo de byte [] 2 GB - 57 B? ), están hablando de gastos generales. Pero la sobrecarga de 0x10000 no parece un tipo o información de índice, ¿verdad? Por lo tanto, no puedo aceptar la respuesta "porque hay una sobrecarga de tiempo de ejecución". Es como explicar que la sal sabe salada porque contiene una sustancia salada.
Supongo que uno debe ser consciente del razonamiento detrás de los detalles de implementación de .net para explicar realmente ese número.
Por curiosidad, miré la fuente de System.Array
y encontré esto:
https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/shared/System/Array.cs
// We impose limits on maximum array lenght in each dimension to allow efficient // implementation of advanced range check elimination in future. // Keep in sync with vm\gcscan.cpp and HashHelpers.MaxPrimeArrayLength. // The constants are defined in this method: inline SIZE_T MaxArrayLength(SIZE_T componentSize) from gcscan // We have different max sizes for arrays with elements of size 1 for backwards compatibility internal const int MaxArrayLength = 0X7FEFFFFF; internal const int MaxByteArrayLength = 0x7FFFFFC7;
Esa fue una versión de .NET 3.1 Core. No dudaría si fuera lo mismo para otras versiones. Aparentemente, la intención es algún tipo de optimización. Quizás alguien podría agregar razones más autorizadas a esta respuesta o publicar otra.