Подтвердить что ты не робот

Enum.GetNames() приводит к неожиданному порядку с отрицательными константами enum

У меня есть следующее определение перечисления (в С#):

public enum ELogLevel
{
    General = -1,  // Should only be used in drop-down box in Merlinia Administrator log settings
    All = 0,       // Should not be used as a level, only as a threshold, effectively same as Trace
    Trace = 1,
    Debug = 2,
    Info = 3,
    Warn = 4,
    Error = 5,
    Fatal = 6,
    Off = 7        // Should not be used as a level, only as a threshold
}

Теперь, когда я делаю Enum.GetNames() в этом типе, я получаю строковый массив с 9 элементами, как ожидалось, но порядок - это All, Trace,..., Off, General, чего я не ожидал.

Здесь MSDN документация для Enum.GetNames():

"Примечания: Элементы массива возвращаемых значений сортируются по значения перечислимых констант.

Что здесь происходит? Я могу изменить свою программу, чтобы учитывать эту "функциональность", но я бы хотел узнать, почему .NET делает то, что она делает.

4b9b3361

Ответ 1

Это известная ошибка с GetNames() и GetValues(), о которой сообщалось здесь, но в итоге она закрылась, так как не будет исправить:

Да, этот метод действительно имеет ошибку, где он возвращает массив значений перечисления, отсортированных как unsigned-types (-2 - 0xFFFFFFFE и -1 - 0xFFFFFFFF в двух дополнениях, поэтому они появляются в конце списка ) вместо того, чтобы возвращать значения, отсортированные по их подписанным типам.

К сожалению, мы не можем изменить порядок сортировки GetValues, потому что мы сломаем все существующие программы .NET, которые были написаны, чтобы зависеть от текущего поведения сортировки [...]

Похоже, вам придется самостоятельно изменить порядок значений.

Ответ 2

В зависимости от того, как происходит сортировка, может быть, что он сортирует значения так, как если бы они были без знака, в этом случае -1 = 0xffffffff, что, конечно, больше 7.