2010-06-25 103 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

相關問題