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 делает то, что она делает.
Ответы
Ответ 1
Это известная ошибка с GetNames()
и GetValues()
, о которой сообщалось здесь, но в итоге она закрылась, так как не будет исправить:
Да, этот метод действительно имеет ошибку, где он возвращает массив значений перечисления, отсортированных как unsigned-types (-2 - 0xFFFFFFFE и -1 - 0xFFFFFFFF в двух дополнениях, поэтому они появляются в конце списка ) вместо того, чтобы возвращать значения, отсортированные по их подписанным типам.
К сожалению, мы не можем изменить порядок сортировки GetValues, потому что мы сломаем все существующие программы .NET, которые были написаны, чтобы зависеть от текущего поведения сортировки [...]
Похоже, вам придется самостоятельно изменить порядок значений.
Ответ 2
В зависимости от того, как происходит сортировка, может быть, что он сортирует значения так, как если бы они были без знака, в этом случае -1 = 0xffffffff, что, конечно, больше 7.