试试这个:
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 的列表,其中 T 实现了 IDisposable。所以编译器很乐意接受上述扩展方法。
进一步(只是因为这是一个很好的例子):
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();