gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:11:08 25 4
gpt4 key购买 nike

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

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

快速解释:A List<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();

关于c# - 处理列表的扩展方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15082967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com