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 が 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();
于 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 に答える