我为装箱的RegistryItem对象定义了以下IComparer:

public class BoxedRegistryItemComparer : IComparer<object>
{
    public int Compare(object left, object right)
    {
        RegistryItem leftReg = (RegistryItem)left;
        RegistryItem rightReg = (RegistryItem)right;

        return string.Compare(leftReg.Name, rightReg.Name);
    }
}

我想用它来对装箱的RegistryItems 的ArrayList 进行排序(它实际上应该是一个List <RegistryItem>,但这超出了我的控制范围)。

ArrayList regItems = new ArrayList();
// fill up the list ...
BoxedRegistryItemComparer comparer = new BoxedRegistryItemComparer();
ArrayList.sort(comparer);

但是,最后一行给出了编译器错误:“无法从 BoxedRegistryItemComparer 转换为 System.Collections.IComparer”。如果有人能指出我的错误,我将不胜感激。


BoxedRegistryItemComparer应该实现System.Collections.IComparer与 一起使用ArrayList.Sort你实现的System.Collections.Generic.IComparer<T>不是同一件事。


您定义了一个Generic-Comparer ( IComparer<T>)而不是没有类型的 Comparer ( IComparer)ArrayList.Sort()期望一个非通用的IComparer.

泛型类型不能转换为其非泛型等价物。


如果您无法控制比较器或排序器,这里有两个迷你类可以在两种类型之间进行转换(未经测试):

private class GenericComparer<T> : IComparer<T>
{
    IComparer _Comparer;
    public GenericComparer(IComparer comparer)
    {
        _Comparer = comparer;
    }
    public int Compare(T a, T b)
    {
        return _Comparer.Compare(a, b);
    }
}

private class NonGenericComparer<T> : IComparer
{
    IComparer<T> _Comparer;
    public NonGenericComparer(IComparer<T> comparer)
    {
        _Comparer = comparer;
    }
    public int Compare(object a, object b)
    {
        return _Comparer.Compare((T)a, (T)b);
    }
}

也许它是一个拐杖,但它确实有效:

            arrayList.Sort(Comparer<object>.Create(
            (x, y) => ((RegistryItem)x).Name.CompareTo(((RegistryItem)y).Name)));

上述帖子的替代方法是让您的比较器类实现这两个接口,然后如果您需要这两个接口,则可以将 IComparer<T> 强制转换为 IComparer。

public class MyComparer<T> : IComparer<T>, IComparer

public class BoxedRegistryItemComparer : IComparer {
...
}