【问题标题】:Generic Delegate and IList<T>通用委托和 IList<T>
【发布时间】:2010-06-25 18:04:03
【问题描述】:

我想为冒泡排序实现一个委托解决方案。我有这个代码:

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”

【问题讨论】:

    标签: delegates ilist


    【解决方案1】:

    是的 - 您的 bubble_sort 方法需要 int[] 作为参数,而 SortHandler 仅指定 IList&lt;T&gt;。您不能从bubble_sort 创建SortHandler&lt;int&gt;

    仅仅因为您碰巧对int[] 进行排序并不意味着CollectionHelper.Sort 一定会使用数组而不是(例如)List&lt;int&gt; 来调用委托。

    例如,考虑这个实现:

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

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

    最简单的解决方案是将您的bubble_sort 方法更改为接受IList&lt;int&gt; 而不仅仅是int[]

    (不过,我不得不说,这是一种有点奇怪的情况。通常,您传递给通用排序方法的处理程序类型是比较任意两个元素 - 而不是执行实际的排序本身。)

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 难道 int[] 没有实现通用接口 IList
      • 那将有完全相同的问题。 int[] 确实实现了IList&lt;int&gt;,但您仍然不能使用接受int[]作为代表的方法,该委托旨在接受任何 IList&lt;int&gt;.
      • 当你的权利,你的权利。教我不注意。我可以对自己投反对票吗?
      猜你喜欢
      • 2012-10-02
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多