Числовые константы в перечислении (C#)

Я создаю это поле выбора в веб-части SharePoint, и мне нужно иметь раскрывающийся список с текущей версией, поэтому мне нужно использовать Enum.

public enum SelectVersionEnum { 2010, 2007 };

Ну, вы можете видеть, где он ломается, есть ли способ использовать целые числа в перечислении? Больше всего я хотел бы использовать

public enum SelectVersionEnum { 2010=14, 2007=12 };

person Eric Herlitz    schedule 14.03.2011    source источник
comment
Ответы ниже правильные. Задумайтесь на минуту о том, что даже если C# позволяет это, это действительно плохая идея и кошмар обслуживания. Это код, который в конечном итоге будет опубликован в Daily WTF.   -  person Clinton Pierce    schedule 14.03.2011


Ответы (5)


Нет, вы не можете называть перечисления целыми именами.

Имя значения перечисления является обычным идентификатором и должно соответствовать тем же правилам, что и все остальное.

Однако вы можете использовать:

public enum SelectVersionEnum
{
    Version2007 = 12,
    Version2010 = 14
}

Кроме того, Enum.Parse может анализировать строки с целыми числами в соответствующие значение перечисления, даже если значение, описанное в строке, не существует.

Попробуйте следующее в LINQPad:

void Main()
{
    Enum.Parse(typeof(SelectVersionEnum), "12").Dump();
    Enum.Parse(typeof(SelectVersionEnum), "14").Dump();
    Enum.Parse(typeof(SelectVersionEnum), "2007").Dump();
}

public enum SelectVersionEnum
{
    Version2007 = 12,
    Version2010 = 14
}

Выход:

Version2007
Version2010
2007

Как вы думаете, что произошло бы, если бы вы определили следующее:

public enum SelectVersionEnum
{
    12 = 14,
    14 = 16
}

Строка «14» теперь означает «12» или «14»?

person Lasse V. Karlsen    schedule 14.03.2011

Элементы перечисления должны быть действительными идентификаторами C#.
Они не могут начинаться с цифр.

Вместо этого вы можете использовать что-то вроде Office2007, Office2010 или V2007, V2010.

person SLaks    schedule 14.03.2011

Нет, идентификаторы перечисления не могут начинаться с числового символа.

person Femaref    schedule 14.03.2011

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

Таким образом, вы можете создать расширение для своего SelectVersionEnum, чтобы помочь вам получить значения перечисления в правильном формате...

public static class SelectVersionEnumExtension
{
     public static int Version(this SelectVersionEnum enumValue)
     {
         return 0; // Obviously you should return something meaningful here..
     }
}

Это дает вам большую гибкость.

person Joel Gauvreau    schedule 14.03.2011

Один из способов получить числовые значения, связанные с перечислениями, — это использовать атрибут описания. Например, у вас может быть перечисление:

[Serializable]
public enum SelectVersionEnum
{
    [Description("2007")]
    v2007,
    [Description("2010")]
    v2010
}

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

public static string Description(this Enum value)
{
    var type = value.GetType();

    var name = Enum.GetName(type, value);

    if (name != null)
    {
        if (type.GetField(name) != null)
        {
            var attr = Attribute.GetCustomAttribute(type.GetField(name), typeof(DescriptionAttribute)) as DescriptionAttribute;

            return attr != null ? attr.Description : name;
        }
    }

    return null;

} // end

Вы бы использовали это так:

var version = SelectVersionEnum.v2007.Description();
person John Meyer    schedule 04.11.2016