In contrast, the variable j2 denotes a .jagged. array, or an .array of
arrays.. Specifically, j2 denotes an
array of an array of int, or a single-dimensional array of type int[]. Each
of these int[] variables can be
initialized individually, and this allows the array to take on a jagged
shape. The example gives each of the
int[] arrays a different length. Specifically, the length of j2[0] is 3,
the length of j2[1] is 6, and the
length of j2[2] is 9.
[Note: In C++, an array declared as int x[3][5][7] would be considered a
three dimensional rectangular
array, while in C#, the declaration int[][][] declares a jagged array type.
end note]
The element type and shape of an array.including whether it is jagged or
rectangular, and the number of
dimensions it has.are part of its type. On the other hand, the size of the
array.as represented by the length
of each of its dimensions.is not part of an array.s type. This split is
made clear in the language syntax, as
the length of each dimension is specified in the array creation expression
rather than in the array type. For
instance the declaration
int[,,] a3 = new int[10, 20, 30];
has an array type of int[,,] and an array creation expression of new
int[10, 20, 30].
For local variable and field declarations, a shorthand form is permitted so
that it is not necessary to re-state
the array type. For instance, the example
int[] a1 = new int[] {1, 2, 3};
can be shortened to
int[] a1 = {1, 2, 3};
without any change in program semantics.
The context in which an array initializer such as {1, 2, 3} is used
determines the type of the array being
initialized. The example
class Test
{
static void Main() {
short[] a = {1, 2, 3};
int[] b = {1, 2, 3};
long[] c = {1, 2, 3};
}
}
shows that the same array initializer syntax can be used for several
different array types. Because context is
required to determine the type of an array initializer, it is not possible
to use an array initializer in an
expression context without explicitly stating the type of the array.