Listは要素の数は可変ですが、現在の要素数(Count)を超えるインデックスを指定した場合は例外ArgumentOutOfRangeExceptionがスローされます。 例えば、次のコードのように現在の要素数よりも大きなインデックスを指定しても、その分の容量が自動的に確保されるわけではない点に注意してください。

Listにおける容量の自動的な拡張は、Addメソッドなどによって要素が追加・挿入される場合にのみ行われます。 従って、上記のように現在の要素数よりも大きいインデックスに要素を格納したい場合は、Addメソッドを使って必要な要素数になるまで適当な値の追加を繰り返す必要があります。

Addメソッドを使ってListの容量を拡張する
using System;
using System.Collections.Generic;

class Sample {
  static void Main()
  {
    // 要素数が3(=インデックスの上限が2)のList
    List<int> list = new List<int>() {0, 1, 2};

    // インデックス99に値を設定するために、
    // 要素数が100になるまでListに適当な値を追加する
    while (list.Count < 100) {
      list.Add(-1);
    }

    // インデックス99に値を設定する
    list[99] = 99;
  }
}
実行結果
ハンドルされていない例外: System.ArgumentOutOfRangeException: インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメーター名: index
   場所 System.Collections.Generic.List`1.set_Item(Int32 index, T value)
   場所 Sample.Main()

あるいは、あらかじめ必要な要素数を確保した配列を用意してからそれをもとにListを作成する、といった方法を取ることもできます。 次の例では、全要素数が100の配列を用意してからListを作成しています。

上記の例では、元になる配列arrと、それをもとに作成するlistの二つで個別にインスタンスが確保されている点に注意してください。

Listの要素数・容量に関して、後述の§.容量も合わせて参照してください。