2010-06-25 1 views
0

Я хочу реализовать решение для делегатов для сортировки Bubble. У меня есть этот код:Generic Delegate и 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>. Вы не можете создать 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[].

(Это немного странная ситуация, хотя, я должен сказать. Обычно вид обработчика, который вы передадите в общий метод сортировки, был бы чем-то, что бы сравнить любые два элемента - не выполнять собственно сортировку.)

-1

Я думаю, проблема в том, что ваш int[] не является IList. Если вы измените SortHandler делегата следующим образом:

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

вы должны быть в состоянии использовать массивы, списки, или что вы хотите.

+0

Не int [] реализует общий интерфейс IList ? –

+1

Это будет иметь ту же проблему. 'int []' * does * реализует 'IList ', но вы все еще не можете использовать метод, который будет * только * принимать 'int []' для делегата, который должен принимать * any * 'IList ' , –

+0

Когда ваше право, ваше право. Научите меня не обращать внимания. Могу ли я проголосовать за себя? – ckramer