排序非IComparable对象

时间:2011-02-20 14:03:48

标签: c# arrays generics sorting constraints

根据文件:

  

System.Array.Sort<T> - 使用System.Array的每个元素的System.IComparable泛型接口实现对整个System.Array中的元素进行排序。

今天我发现,这段代码正在编译,没有任何错误和警告:

A []arr = new A[10];//A is not inheriting from IComparable !!

//initializing elements of arr
...

System.Array.Sort<A>(arr);

执行后我遇到了运行时错误。

那么为什么这段代码正在编译?我不是C#的专家,但我知道,C#泛型支持约束语法。为什么约束不用于Array.Sort?

1 个答案:

答案 0 :(得分:2)

编译中因为T没有约束它必须实现IComparable<T>

我认为文档有点令人困惑,因为数组元素实际不必实现IComparable<T>与调用相同的T。例如,这很好用:

using System;

class Test
{
    static void Main()
    {
        object[] objects = { "d", "b", "c", "a" };        
        Array.Sort<object>(objects);
    }
}

我认为仅仅说元素必须“以某种方式”相互比较是更明智的。例如,这很好,即使没有实现泛型 IComparable接口:

using System;

class A : IComparable
{
    private readonly int value;

    public A(int value)
    {
        this.value = value;
    }

    public int CompareTo(object other)
    {
        // Just cast for now...
        return value.CompareTo(((A)other).value);
    }
}

class Test
{
    static void Main()
    {
        object[] objects = { new A(5), new A(3), new A(4) };
        Array.Sort<object>(objects);
    }
}