通用委托和IList <t> </t>

时间:2010-06-25 18:04:03

标签: delegates ilist

我想为Bubble sort实现一个委托解决方案。我有这段代码:

public delegate void SortHandler<T>(IList<T> t);

public static void Sort<T>(IList<T> arr, SortHandler<T> func)
{
func(arr);
}

int[] arr2 = { 10,1,2,3,4 };
CollectionHelper.Sort<int>(arr2, bubble_sort);

冒泡排序功能签名是:

static void bubble_sort(int[] array) {}

我收到此错误:

参数'2':无法从'方法组'转换为'DelegatesAndGenerics.SortHandler

2 个答案:

答案 0 :(得分:3)

是的 - 您的bubble_sort方法需要int[]作为参数,而SortHandler仅指定IList<T>。您无法从SortHandler<int>创建bubble_sort

仅仅因为您正好对int[]进行排序并不意味着CollectionHelper.Sort保证使用数组而不是(例如)List<int>来调用委托。

例如,请考虑此实现:

public void Sort<T>(T[] array, SortHandler<T> handler)
{
    List<T> list = new List<T>(array);
    handler(list);
}

如果您设法传递bubble_sort方法作为处理程序,您会如何应对?

最简单的解决方案是将bubble_sort方法更改为接受IList<int>,而不仅仅是int[]

(这是一个有点奇怪的情况,但我必须说。通常你传递给泛型排序方法的那种处理程序可以比较任何两个元素 - 而不是执行实际的排序本身。)< / p>

答案 1 :(得分:-1)

我认为问题是你的int[]不是IList。如果您更改SortHandler代表,请执行以下操作:

public delegate void SortHandler<T>(IEnumerable<T> t);

你应该能够使用数组,列表或任何你想要的东西。