Что определяет, какое имя выбрано при вызове ToString()
по значению enum
, которое имеет несколько соответствующих имен?
Ниже следует подробное объяснение вопроса.
Я определил, что это не определено однозначно ни одним из: алфавитным порядком; порядок объявления; ни, длина имени.
Например, учтите, что я хочу иметь перечисление, где числовые значения соответствуют непосредственно практическому использованию (например, значения rgb для цвета).
public enum RgbColor
{
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff
}
Теперь, с этим перечислением, вызов default(RgbColor)
вернет значение rgb для черного. Скажем, я не хочу, чтобы значение по умолчанию было черным, потому что я хочу, чтобы дизайнеры пользовательских возможностей могли использовать вызов "По умолчанию", когда у них нет конкретных инструкций о том, какой цвет использовать. На данный момент значение по умолчанию для дизайнеров пользовательского интерфейса на самом деле является "голубым", но это может измениться. Итак, я добавляю дополнительное определение TextDefault
в перечисление, и теперь оно выглядит так:
public enum RgbColorWithTextDefaultFirst
{
TextDefault = 0x0000ff,
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff
}
Теперь, я проверил это, и я обнаружил, что вызов RgbColorWithTextDefaultFirst.TextDefault.ToString()
и RgbColorWithTextDefaultFirst.Blue.ToString()
обе дает "синий". Итак, я понял, что имя, объявленное последним, перезапишет имя предыдущих объявлений. Чтобы проверить мое предположение, я написал:
public enum RgbColorWithTextDefaultLast
{
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff,
TextDefault = 0x0000ff
}
Однако, к моему удивлению, RgbColorWithTextDefaultLast.Blue.ToString()
и RgbColorWithTextDefaultLast.TextDefault.ToString()
. Моя следующая догадка заключается в том, что он сортирует имена по алфавиту и возвращает первый. Чтобы проверить это, я пытаюсь:
public enum RgbColorWithATextDefaultFirst
{
ATextDefault = 0x0000ff,
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff
}
public enum RgbColorWithATextDefaultLast
{
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff,
ATextDefault = 0x0000ff
}
Теперь, для всех четырех из RgbColorWithATextDefaultFirst.ATextDefault.ToString()
, RgbColorWithATextDefaultFirst.Blue.ToString()
, RgbColorWithATextDefaultLast.ATextDefault.ToString()
, RgbColorWithATextDefaultLast.Blue.ToString()
, я получаю "Синий". Я понимаю, что есть еще один отличительный фактор, который является длиной строки. Я предполагаю, что выбранное имя определяется длиной строки имени. Итак, мой тест заключается в использовании этих объявлений:
public enum RgbColorWithALast
{
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff,
A = 0x0000ff
}
public enum RgbColorWithAFirst
{
A = 0x0000ff,
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff
}
Теперь угадайте, какое значение я получил для всего: RgbColorWithAFirst.A.ToString()
; RgbColorWithAFirst.Blue.ToString()
; RgbColorWithALast.A.ToString()
, RgbColorWithALast.Blue.ToString()
. Это правильно, "Синий".
В этот момент я отказался от попыток выяснить, что определяет это, гадая. Я открыл рефлектор, и я собираюсь взглянуть и попытаюсь понять это, но я решил, что задаю здесь вопрос, чтобы узнать, знает ли кто-нибудь, кто здесь уже знает ответ, а именно: Что определяет какое имя выбрано при вызове ToString()
по значению enum
, которое имеет несколько соответствующих имен?