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

Listではインデックスで指定した分の要素数が自動的に確保されるわけではない
using System;
using System.Collections.Generic;

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

    // インデックス0の要素に値を設定する
    list[0] = 0;
    // (インデックス0は全要素数3の範囲内なので例外はスローされない)

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

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

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

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

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