これを試して:
public static void Dispose<T>(this List<T> list) where T : IDisposable {
for (int i = 0, il = list.Count; i < il; i++) {
list[i].Dispose();
}
list.Clear();
}
簡単な説明: AList<Bitmap>
は、ビットマップ自体が IDisposable であっても、IDisposable のリストではなく、ビットマップのリストです。ただし、ビットマップのリストは、T のリスト、またはより正確には、T が IDisposable を実装する T のリストです。したがって、コンパイラは上記の拡張メソッドを喜んで受け入れます。
さらに(これがとても良い例になるという理由だけで):
List<T>
型パラメータに関して不変であると言われています。したがって、次の割り当ては許可されておらず、コンパイラ エラーが発生します。
List<IDisposable> l = new List<Bitmap>();
また、次の型変換もありません。
List<Bitmap> lb = new List<Bitmap>();
List<IDisposable> ld = (List<IDisposable>)lb;
ただし、.NET 4 (型パラメーターの分散が導入された場所) を使用していて、共変型パラメーター ( など) を持つジェネリック型を使用する場合IEnumerable<out T>
、次の型変換が有効になります。
List<Bitmap> lb = new List<Bitmap>();
IEnumerable<IDisposable> ld = lb;
そして実際にあなたのために暗黙のうちに行われます。この場合、次の拡張メソッドも機能します。
// In a static class:
public static void Dispose(this IEnumerable<IDisposable> e) {
foreach(var x in e) {
x.Dispose();
}
}
// Somewhere else:
List<Bitmap> l = new List<Bitmap>();
l.Dispose();