配列Arrays

配列は、さまざまな算出されたインデックスを介してアクセスする変数を含むデータ構造です。An array is a data structure that contains a number of variables which are accessed through computed indices. 配列の要素とも呼ばれます。 配列に含まれる変数はすべて、同じ型と、この型には、配列の要素の型が呼び出されます。The variables contained in an array, also called the elements of the array, are all of the same type, and this type is called the element type of the array.

配列には、配列の各要素に関連付けられているインデックスの数を決定するランクがあります。An array has a rank which determines the number of indices associated with each array element. 配列のランクは、配列のディメンションであるとも呼ばれます。The rank of an array is also referred to as the dimensions of the array. ランクが 1 の配列と呼ばれる、 1 次元配列します。An array with a rank of one is called a single-dimensional array. 配列と呼ばれる 1 つより大きいランクを持つ、多次元配列します。An array with a rank greater than one is called a multi-dimensional array. 特定のサイズが設定された多次元配列は、2 次元配列や 3 次元の配列とも呼ばれます。Specific sized multi-dimensional arrays are often referred to as two-dimensional arrays, three-dimensional arrays, and so on.

配列の各次元が、関連付けられた長さはゼロに整数の数より大きいか等しいです。Each dimension of an array has an associated length which is an integral number greater than or equal to zero. 次元の長さは、配列の型の一部ではありませんが、配列型のインスタンスが実行時に作成されたときに確立されます。The dimension lengths are not part of the type of the array, but rather are established when an instance of the array type is created at run-time. 次元の長さは、その次元のインデックスの有効な範囲を決定します。長さのディメンションのN、インデックスの範囲は0N - 1包括的です。The length of a dimension determines the valid range of indices for that dimension: For a dimension of length N, indices can range from 0 to N - 1 inclusive. 配列内の要素の合計数は、配列の各次元の長さの製品です。The total number of elements in an array is the product of the lengths of each dimension in the array. 1 つ以上の配列の次元の長さ 0 の場合、配列は空にすることはできます。If one or more of the dimensions of an array have a length of zero, the array is said to be empty.

配列の要素型には、配列型を含む任意の型を指定できます。The element type of an array can be any type, including an array type.

配列型Array types

配列型として書き込まれます、 non_array_type 1 つまたは複数続くrank_specifier: %sAn array type is written as a non_array_type followed by one or more rank_specifiers:

array_type
    : non_array_type rank_specifier+
    ;

non_array_type
    : type
    ;

rank_specifier
    : '[' dim_separator* ']'
    ;

dim_separator
    : ','
    ;

A non_array_typeは anyいない自体は、 array_typeします。A non_array_type is any type that is not itself an array_type.

配列型のランクが左端で指定されたrank_specifierで、 array_type:A rank_specifier配列が 1 を加えた数のランクを持つ配列であることを示します","のトークン、 rank_specifierします。The rank of an array type is given by the leftmost rank_specifier in the array_type: A rank_specifier indicates that the array is an array with a rank of one plus the number of "," tokens in the rank_specifier.

配列型の要素型が、左端を削除した結果を型rank_specifier:The element type of an array type is the type that results from deleting the leftmost rank_specifier:

  • フォームの配列型T[R]配列のランクを持つRと非配列要素型をTします。An array type of the form T[R] is an array with rank R and a non-array element type T.
  • フォームの配列型T[R][R1]...[Rn]配列のランクを持つRと要素型T[R1]...[Rn]します。An array type of the form T[R][R1]...[Rn] is an array with rank R and an element type T[R1]...[Rn].

実際には、 rank_specifiers は、非配列の最後の要素型の前に右に左から読み取られます。In effect, the rank_specifiers are read from left to right before the final non-array element type. int[][,,][,]の 2 次元の配列の 3 次元の配列の 1 次元配列は、intします。The type int[][,,][,] is a single-dimensional array of three-dimensional arrays of two-dimensional arrays of int.

実行時に、配列型の値を指定できますnullまたはその配列型のインスタンスへの参照。At run-time, a value of an array type can be null or a reference to an instance of that array type.

System.Array 型The System.Array type

System.Arrayはすべての配列型の抽象基本型です。The type System.Array is the abstract base type of all array types. 暗黙の参照変換 (暗黙の参照変換) から任意の配列型に存在するSystem.Array、および明示的な参照変換 (明示的な参照変換) が存在します。System.Array任意の配列型にします。An implicit reference conversion (Implicit reference conversions) exists from any array type to System.Array, and an explicit reference conversion (Explicit reference conversions) exists from System.Array to any array type. なおSystem.Array自体ではありません、 array_typeします。Note that System.Array is not itself an array_type. Class_typeすべてからarray_types が派生します。Rather, it is a class_type from which all array_types are derived.

実行時の型の値にSystem.Arrayできるnullまたは任意の配列型のインスタンスへの参照。At run-time, a value of type System.Array can be null or a reference to an instance of any array type.

配列とジェネリックの IList インターフェイスArrays and the generic IList interface

1 次元配列T[]インターフェイスを実装するSystem.Collections.Generic.IList<T>(IList<T>略して) とその基本インターフェイスです。A one-dimensional array T[] implements the interface System.Collections.Generic.IList<T> (IList<T> for short) and its base interfaces. したがってからの暗黙的な変換があるT[]IList<T>とその基本インターフェイスです。Accordingly, there is an implicit conversion from T[] to IList<T> and its base interfaces. さらからの暗黙的な参照変換がある場合STS[]実装IList<T>から暗黙の参照変換があるとS[]IList<T>およびその基本インターフェイス (暗黙の参照変換)。In addition, if there is an implicit reference conversion from S to T then S[] implements IList<T> and there is an implicit reference conversion from S[] to IList<T> and its base interfaces (Implicit reference conversions). 明示的な参照変換がある場合STからの明示的な参照変換はS[]IList<T>とその基本インターフェイス (明示的な参照変換).If there is an explicit reference conversion from S to T then there is an explicit reference conversion from S[] to IList<T> and its base interfaces (Explicit reference conversions). 例えば:For example:

using System.Collections.Generic;

class Test
{
    static void Main() {
        string[] sa = new string[5];
        object[] oa1 = new object[5];
        object[] oa2 = sa;

        IList<string> lst1 = sa;                    // Ok
        IList<string> lst2 = oa1;                   // Error, cast needed
        IList<object> lst3 = sa;                    // Ok
        IList<object> lst4 = oa1;                   // Ok

        IList<string> lst5 = (IList<string>)oa1;    // Exception
        IList<string> lst6 = (IList<string>)oa2;    // Ok
    }
}

割り当てlst2 = oa1以降からの変換、コンパイル時エラーが発生object[]IList<string>はいない暗黙的な明示的な変換をします。The assignment lst2 = oa1 generates a compile-time error since the conversion from object[] to IList<string> is an explicit conversion, not implicit. キャスト(IList<string>)oa1が以降の実行時にスローされる例外が発生oa1参照、object[]および not、string[]します。The cast (IList<string>)oa1 will cause an exception to be thrown at run-time since oa1 references an object[] and not a string[]. ただし、キャスト(IList<string>)oa2からスローされる例外は発生しませんoa2参照、string[]します。However the cast (IList<string>)oa2 will not cause an exception to be thrown since oa2 references a string[].

暗黙的または明示的な参照変換が存在する場合はS[]IList<T>からの明示的な参照変換もIList<T>その基本インターフェイスとS[](明示的な参照変換)。Whenever there is an implicit or explicit reference conversion from S[] to IList<T>, there is also an explicit reference conversion from IList<T> and its base interfaces to S[] (Explicit reference conversions).

配列型S[]実装IList<T>、実装されたインターフェイスのメンバーの一部の例外をスローする可能性があります。When an array type S[] implements IList<T>, some of the members of the implemented interface may throw exceptions. インターフェイスの実装の動作の詳細についてはこの仕様の範囲外です。The precise behavior of the implementation of the interface is beyond the scope of this specification.

配列の作成Array creation

配列のインスタンスがによって作成されたarray_creation_expressions (配列作成式) フィールド、ローカル変数の宣言が含まれるかをarray_initializer(配列初期化子)。Array instances are created by array_creation_expressions (Array creation expressions) or by field or local variable declarations that include an array_initializer (Array initializers).

配列インスタンスが作成されるが確立されているランクと各次元の長さと、インスタンスの有効期間にわたって一定です。When an array instance is created, the rank and length of each dimension are established and then remain constant for the entire lifetime of the instance. つまり、既存の配列インスタンスのランクを変更することはできませんも、そのディメンションのサイズを変更することはできます。In other words, it is not possible to change the rank of an existing array instance, nor is it possible to resize its dimensions.

配列型の配列インスタンスは常にです。An array instance is always of an array type. System.Array型が抽象型をインスタンス化することはできません。The System.Array type is an abstract type that cannot be instantiated.

によって作成された配列の要素array_creation_expressions は必ずが既定値に初期化 (既定値)。Elements of arrays created by array_creation_expressions are always initialized to their default value (Default values).

配列要素へのアクセスArray element access

配列の要素が使用してアクセスelement_access式 (配列アクセス) フォームのA[I1, I2, ..., In]ここで、A配列型とそれぞれの式を指定Ixが、型の式intuintlongulong、または 1 つ以上のこれらの型に暗黙的に変換できます。Array elements are accessed using element_access expressions (Array access) of the form A[I1, I2, ..., In], where A is an expression of an array type and each Ix is an expression of type int, uint, long, ulong, or can be implicitly converted to one or more of these types. 配列要素へのアクセスの結果は、変数、インデックスによって選択されている配列要素つまりです。The result of an array element access is a variable, namely the array element selected by the indices.

使用して、配列の要素を列挙することができます、foreachステートメント (foreach ステートメント)。The elements of an array can be enumerated using a foreach statement (The foreach statement).

配列メンバーArray members

すべての配列型で宣言されたメンバーの継承、System.Array型。Every array type inherits the members declared by the System.Array type.

配列の共変性Array covariance

任意の 2 つのreference_typesAB暗黙の参照変換の場合は、(暗黙の参照変換) または明示的な参照変換 (明示的な参照変換) から存在するAB、配列型から、同じ変換が存在し、A[R]配列型にB[R]ここで、Rは any指定されたrank_specifier (ただし、配列の両方で同じ型)。For any two reference_types A and B, if an implicit reference conversion (Implicit reference conversions) or explicit reference conversion (Explicit reference conversions) 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. 配列の共変性であることを意味、配列型の値をA[R]実際には、配列型のインスタンスへの参照がありますB[R]から暗黙の参照変換が存在する限り、BAします。Array covariance in particular means that a value of an array type A[R] may actually be a reference to an instance of an array type B[R], provided an implicit reference conversion exists from B to A.

参照型の配列の要素への代入には、配列の共変性によりにより許可されている型の配列の要素に割り当てられている値が実際には、実行時チェックが含まれます (単純な代入)。Because of array covariance, assignments to elements of reference type arrays include a run-time check which ensures that the value being assigned to the array element is actually of a permitted type (Simple assignment). 例:For example:

class Test
{
    static void Fill(object[] array, int index, int count, object value) {
        for (int i = index; i < index + count; i++) array[i] = value;
    }

    static void Main() {
        string[] strings = new string[100];
        Fill(strings, 0, 100, "Undefined");
        Fill(strings, 0, 10, null);
        Fill(strings, 90, 10, 0);
    }
}

代入array[i]で、Fillメソッドは、実行時のチェックを実行できるようにするによって参照されるオブジェクトを暗黙的に含まれますvaluenullの実際の要素の型と互換性があるインスタンスまたはarray.The assignment to array[i] in the Fill method implicitly includes a run-time check which ensures that the object referenced by value is either null or an instance that is compatible with the actual element type of array. Mainの最初の 2 つの呼び出しFill失敗すると、3 つ目の呼び出しの原因が、System.ArrayTypeMismatchExceptionへの最初の割り当てを実行したときにスローされるarray[i]In Main, the first two invocations of Fill succeed, but the third invocation causes a System.ArrayTypeMismatchException to be thrown upon executing the first assignment to array[i]. 例外が発生するため、ボックス化されたintで格納することはできません、string配列。The exception occurs because a boxed int cannot be stored in a string array.

配列の共変性は起こりませんの配列にvalue_type秒。Array covariance specifically does not extend to arrays of value_types. たとえば、変換が存在しないこと、int[]として扱う場合に、object[]します。For example, no conversion exists that permits an int[] to be treated as an object[].

配列初期化子Array initializers

フィールドの宣言で配列初期化子を指定することがあります (フィールド)、ローカル変数の宣言 (ローカル変数宣言) を配列作成式 (配列の作成式)。Array initializers may be specified in field declarations (Fields), local variable declarations (Local variable declarations), and array creation expressions (Array creation expressions):

array_initializer
    : '{' variable_initializer_list? '}'
    | '{' variable_initializer_list ',' '}'
    ;

variable_initializer_list
    : variable_initializer (',' variable_initializer)*
    ;

variable_initializer
    : expression
    | array_initializer
    ;

配列初期化子で囲まれた変数の初期化子のシーケンスから成る"{「と」}「トークンし、で区切られた」,"トークンです。An array initializer consists of a sequence of variable initializers, enclosed by "{" and "}" tokens and separated by "," tokens. 各変数の初期化子が式または、多次元配列、入れ子になった配列初期化子。Each variable initializer is an expression or, in the case of a multi-dimensional array, a nested array initializer.

配列初期化子が使用されているコンテキストでは、初期化される配列の型を決定します。The context in which an array initializer is used determines the type of the array being initialized. 配列作成式で配列型はすぐに、初期化子の前または配列初期化子式から推論されます。In an array creation expression, the array type immediately precedes the initializer, or is inferred from the expressions in the array initializer. フィールドまたは変数宣言では、配列型は、フィールドまたは宣言される変数の型です。In a field or variable declaration, the array type is the type of the field or variable being declared. 配列初期化子で使用する場合、フィールドまたは変数の宣言など。When an array initializer is used in a field or variable declaration, such as:

int[] a = {0, 2, 4, 6, 8};

等価な配列作成式を簡略にすることをお勧めします。it is simply shorthand for an equivalent array creation expression:

int[] a = new int[] {0, 2, 4, 6, 8};

1 次元配列では、配列初期化子必要がありますの配列の要素の型と互換性のある代入である、式のシーケンスで構成されます。For a single-dimensional array, the array initializer must consist of a sequence of expressions that are assignment compatible with the element type of the array. 式は、昇順に並べ替え、インデックス 0 位置にある要素で始まる配列の要素を初期化します。The expressions initialize array elements in increasing order, starting with the element at index zero. 配列初期化子式の数は、作成される配列インスタンスの長さを決定します。The number of expressions in the array initializer determines the length of the array instance being created. たとえば、上記の配列初期化子を作成します、int[]長さ 5 のインスタンスとし、次の値を使用して、インスタンスを初期化します。For example, the array initializer above creates an int[] instance of length 5 and then initializes the instance with the following values:

a[0] = 0; a[1] = 2; a[2] = 4; a[3] = 6; a[4] = 8;

多次元配列、配列初期化子は、配列内のディメンションとしての入れ子のレベル数だけが必要です。For a multi-dimensional array, the array initializer must have as many levels of nesting as there are dimensions in the array. 最も外側の入れ子レベルが最も左にあるディメンションに対応し、最も内側の入れ子レベルが最も右にあるディメンションに対応します。The outermost nesting level corresponds to the leftmost dimension and the innermost nesting level corresponds to the rightmost dimension. 配列の各次元の長さは配列初期化子に対応する入れ子のレベルにある要素の数によって決まります。The length of each dimension of the array is determined by the number of elements at the corresponding nesting level in the array initializer. 入れ子になった配列初期化子の場合、それぞれは、要素の数は同じレベルの他の配列初期化子と同じである必要があります。For each nested array initializer, the number of elements must be the same as the other array initializers at the same level. 例:The example:

int[,] b = {{0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}};

左端のディメンションの 5 つの長さと右端のディメンションの 2 つの長さでは、2 次元の配列を作成します。creates a two-dimensional array with a length of five for the leftmost dimension and a length of two for the rightmost dimension:

int[,] b = new int[5, 2];

初期化します、配列インスタンスで、次の値。and then initializes the array instance with the following values:

b[0, 0] = 0; b[0, 1] = 1;
b[1, 0] = 2; b[1, 1] = 3;
b[2, 0] = 4; b[2, 1] = 5;
b[3, 0] = 6; b[3, 1] = 7;
b[4, 0] = 8; b[4, 1] = 9;

長さがゼロで、右端以外のディメンションを指定すると、後続のディメンションが長さがゼロにもと見なされます。If a dimension other than the rightmost is given with length zero, the subsequent dimensions are assumed to also have length zero. 例:The example:

int[,] c = {};

長さが 0 の左端と右端のディメンションでは、2 次元の配列を作成します。creates a two-dimensional array with a length of zero for both the leftmost and the rightmost dimension:

int[,] c = new int[0, 0];

配列作成式には、明示的な次元の長さと配列初期化子の両方が含まれている場合は、長さは定数式である必要があり、各入れ子のレベルにある要素の数が、対応する次元の長さと一致する必要があります。When an array creation expression includes both explicit dimension lengths and an array initializer, the lengths must be constant expressions and the number of elements at each nesting level must match the corresponding dimension length. 次にいくつかの例を示します。Here are some examples:

int i = 3;
int[] x = new int[3] {0, 1, 2};        // OK
int[] y = new int[i] {0, 1, 2};        // Error, i not a constant
int[] z = new int[3] {0, 1, 2, 3};     // Error, length/initializer mismatch

ここでは、初期化子yディメンションの長さの式の定数、および初期化子がないため、コンパイル時エラー結果zのため、コンパイル時エラーの結果の長さと要素の数、初期化子が一致しません。Here, the initializer for y results in a compile-time error because the dimension length expression is not a constant, and the initializer for z results in a compile-time error because the length and the number of elements in the initializer do not agree.