Общий делегат и IList <T> - PullRequest
       29

Общий делегат и IList <T>

0 голосов
/ 25 июня 2010

Я хочу реализовать делегатское решение для 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 ]

3 голосов
/ 25 июня 2010

Да - ваш метод bubble_sort требует int[] в качестве параметра, тогда как SortHandler указывает только IList<T>.Вы не можете создать SortHandler<int> из bubble_sort.

Только то, что вы сортируете int[], не означает, что CollectionHelper.Sort гарантированно вызывает делегат с массивом вместо (скажем) a 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[].

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

0 голосов
/ 25 июня 2010

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

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

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

...