[英]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.