2

我编写了一个简单的扩展方法来处理列表中的所有项目:

public static void Dispose(this List<IDisposable> list) {
    for (int i = 0, il = list.Count; i < il; i++) {
        list[i].Dispose();
    }
    list.Clear();
}

但是当我尝试使用它时,VS IntelliSense 并没有在下拉列表中列出它,并且在编译时找不到该方法。我如何使它工作?

List<Bitmap> bitmaps = new List<Bitmap>();
bitmaps.Dispose(); // Error: List<Bitmap> does not contain a definition for Dispose()
4

3 回答 3

7

试试这个:

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();
于 2013-02-26T06:48:39.863 回答
3

List<Bitmap>不是List<IDisposable>尝试:

public static void Dispose<T>(this List<T> list) where T : IDisposable
于 2013-02-26T06:49:44.013 回答
-2

您必须将List<Bitmap>转换为List<IDisposable>才能使用此扩展方法。

于 2013-02-26T06:47:55.767 回答