2010-06-25 102 views
0

我想实现Bubble排序的委托解决方案。我有这样的代码:通用代理和IList <T>

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

回答

3

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

仅仅因为你碰巧正在排序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[]。 (这是一个稍微有点奇怪的情况,我不得不说,通常你要传入一个通用的排序方法的处理器类型是比较任何两个元素的东西 - 而不是执行实际的排序本身。)

-1

我认为问题在于您的int[]不是IList。如果更改像这样的SortHandler委托:

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

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

+0

不是int []实现通用接口IList ? – 2010-06-25 18:10:18

+1

这将有完全相同的问题。 'int []'*确实实现了'IList ',但是你仍然不能使用一个*只接受一个'int []'的方法来代表任何*'IList ' 。 – 2010-06-25 18:11:02

+0

当你的权利,你的权利。教我不注意。我可以投票自己吗? – ckramer 2010-06-25 21:03:23

相关问题