Сортировка не совместимых объектов - PullRequest
0 голосов
/ 20 февраля 2011

Согласно документации:

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 Ответ

2 голосов
/ 20 февраля 2011

В компилируется , поскольку для 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);
    }
}
...