The C# language only provides covariance for arrays of reference types. This is documented on MSDN:
For any two reference-types A and B, if an implicit reference conversion (Section 6.1.4) or explicit reference conversion (Section 6.2.3) exists from A to B, then the same reference conversion also exists from the array type A[R] to the array type B[R], where R is any given rank-specifier (but the same for both array types). This relationship is known as array covariance.
In your second example, you're using an array of System.Int32 types, which are not reference types, so the array covariance support does not apply. Reference types are, at their core, all storing an array of references, where the references are all an identical size. Value types can be any size, so there is no guarantee that the array elements would be the same size, which prevents this from working properly.