2013-02-26 72 views
0

我写了一个简单的扩展方法列表中的处置掉所有的项目:扩展方法处理列表不工作

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

但是当我尝试使用它时,VS智能感知未列出它在下拉菜单中,并且在编译时无法找到该方法。我如何使它工作?

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

回答

6

试试这个:

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即使位图本身是一个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(); 
+0

太棒了!这完美的作品! – 2013-02-26 06:50:47

-2

你必须在List<Bitmap>投射到List<IDisposable>使用该扩展方法。

+0

类型转换到列表是不可能的。看到我的答案。 – afrischke 2013-02-26 10:08:12

3

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

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