繁体   English   中英

处理列表的扩展方法不起作用

[英]Extension method to Dispose List not working

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

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()

尝试这个:

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();
}

快速说明: List<Bitmap>是位图列表,而不是IDisposables列表,即使Bitmap本身是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();

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

public static void Dispose<T>(this List<T> list) where T : IDisposable

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM