Почему перечисление может иметь два разных имени с одинаковым числовым значением? - PullRequest
26 голосов
/ 30 июня 2010

Я только что обнаружил небольшую ошибку, в которой у меня было перечисление с двумя именами, непреднамеренно разделяющими одно и то же числовое значение (в данном случае red = 10 и crimson = 10). Я немного удивлен, что это не синтаксическая ошибка.

public enum Colour
{
    Red=10,
    Blue=11,
    Green=12,
    Crimson=10
}
// Debug.Write(Colour.Red==Colour.Crimson) outputs True

Существует ли какая-либо реальная причина, по которой такое поведение может быть полезным или же оно должно быть синтаксической ошибкой?

Ответы [ 16 ]

1 голос
/ 26 июля 2010

Иногда рекомендуется (хотя не рекомендуется MS для C #! - см. Комментарий Салароса) включить нижнюю и верхнюю границу в ваше перечисление, например

public enum Colour
{
    LowBound=10,
    Red=10,
    Rouge=10,
    Blue=11,
    Bleu=11,
    Green=12,
    Vert=12,
    Black=13,
    Noir=13,
    UpperBound=13
}

Цели проверки / повторения каждого возможного параметра.Хотя у меня есть ощущение, что .Net может предоставить средство для этого:)

1 голос
/ 30 июня 2010

Использование именованного значения в отличие от фактического значения является корневым.Предположим, у вас есть французский, английский и т. Д. С тем же значением.Это корень enum для меня.

1 голос
/ 30 июня 2010

Всё хорошо.Вы можете иметь два значения, которые отличаются с точки зрения пользователя API, но функционально могут рассматриваться как одно и то же значение.

0 голосов
/ 18 января 2018

Я подумал, что это будет полезно для сопоставления полей, например (в LinqPad):

void Main()
{
    ((FieldName)Enum.Parse(typeof(FieldName), "Name", true)).ToString().Dump();
    ((FieldName)Enum.Parse(typeof(FieldName), "TaskName", true)).ToString().Dump();
    ((FieldName)Enum.Parse(typeof(FieldName), "IsActive", true)).ToString().Dump();
    ((FieldName)Enum.Parse(typeof(FieldName), "TaskIsActive", true)).ToString().Dump();
}

public enum FieldName
{
    Name,
    TaskName = Name,
    IsActive,
    TaskIsActive = IsActive
}

Цель состоит в том, чтобы использовать более короткие имена, однако результаты Parse или TryParse не согласованы иэтот код выводит:

TaskName
TaskName
IsActive
IsActive
0 голосов
/ 22 апреля 2012

Я думаю, что есть много вариантов повторного использования одного и того же номера.В качестве нового примера, скажем, у вас есть система ранжирования, которая гарантирует, что объекты определенного класса (Parent) создаются перед другими зависимыми от него классами (Children), у вас могут быть дети, которые находятся в одном и том же уровне.и не имеет значения, какой из них создан первым.В приведенном ниже примере сначала будет создан родитель, потом ребенок 1, 2 или 3, затем последним будет ребенок 4.Если бы это рассматривалось как древовидная диаграмма, любые элементы с одинаковым номером были бы «братьями и сестрами».

public enum ObjectRanks
{
    Parent = 0,
    Child1 = 1,
    Child2 = 1,
    Child3 = 1,
    Child4 = 2
}

Хотя я вижу вашу точку зрения в том, что это может быть легко сделать по ошибке.В этом случае было бы удобно, если бы в Visual Studio была возможность включить предупреждения, которые позволили бы скомпилировать их, но выдавали бы предупреждение, если один и тот же номер использовался дважды.

0 голосов
/ 30 июня 2010

Я видел то же самое в оболочке .net TWAIN - она ​​позволяет хранить все коды сообщений TWAIN в одном большом перечислении, но поначалу это немного запутывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...