The compiler can infer a larger integral type based upon the inputs to the dimensions calculation, but that does not mean the length of the array can exceed the limit. The compiler is basically converting the value to a native integer in a checked context, using an op code that will throw the overflow. This is to prevent the value from wrapping or otherwise allowing a negative number as the dimension.
As an example, note the array declaration here:
var array = new int[2L + int.MaxValue];
And the resultant IL
IL_0001: ldc.i4 01 00 00 80
IL_0006: conv.u8
IL_0007: conv.ovf.i
IL_0008: newarr System.Int32
IL_000D: stloc.0 // array
Pay particular attention to the third line. That op code is the instruction to produce the conversion and throws the exception upon failure.