Я не хотел вводить это как ответ, потому что он не отвечает на ваш вопрос напрямую, но, основываясь на вашем комментарии в ответ на мой комментарий к вашему вопросу, заслуживает некоторого объяснения.
Перечисления предназначены для очень простых типов безопасных представлений состояния. Если вы просто используете константы, то можете присвоить значение неправильным константам. Это предотвращает назначение неправильного типа константы полю. Например, если у вас есть что-то, что ожидает DayOfWeek, вы не можете назначить значение FileAccess, даже если они обе являются константами одного и того же базового типа.
DayOfWeek day = FileAccess.Write; // doesn't work
Если вам нужен этот тип безопасности и , вам не нужно, чтобы ваш enum демонстрировал какой-либо другой тип поведения, тогда используйте enum. Если вы заинтересованы в том, чтобы ваш enum делал и другие вещи (например, перечисление, математические операции и т. Д.), Тогда вам следует подумать об использовании классов. Смотрите мой пример ниже.
public class LegalShipTypes
{
private readonly byte _numericValue;
private readonly string _text;
private LegalShipTypes(byte numericValue, string text)
{
_numericValue = numericValue;
_text = text;
}
public byte Value { get { return _numericValue; } }
public string Text { get { return _text; } }
public static IEnumerable<LegalShipTypes> All
{
get
{
return new[] { Frigate, Cruiser, Destroyer, Submarine, AircraftCarrier };
}
}
public static readonly LegalShipTypes Frigate = new LegalShipTypes(1, "Frigate");
public static readonly LegalShipTypes Cruiser = new LegalShipTypes(2, "Cruiser");
public static readonly LegalShipTypes Destroyer = new LegalShipTypes(3, "Destroyer");
public static readonly LegalShipTypes Submarine = new LegalShipTypes(4, "Submarine");
public static readonly LegalShipTypes AircraftCarrier = new LegalShipTypes(5, "Aircraft Carrier");
}
Теперь вы можете использовать его безопасным способом, например так:
public class Fleet
{
private readonly List<LegalShipTypes> _ships;
public Fleet()
{
_ships = new List<LegalShipTypes>();
}
public LegalShipTypes Flagship { get; set; }
public ICollection<LegalShipTypes> Ships { get { return _ships; } }
}
....
var fleet = new Fleet();
fleet.FlagShip = LegalShipTypes.AircraftCarrier;
var iDoNotKnowWhyYouWouldNeedThisBut = LegalShipTypes.All.Sum(ship => ship.Value);
Console.WriteLine("The flagship is a(n) \"{0}\".", fleet.FlagShip.Text);
if (fleet.FlagShip == LegalShipTypes.AircraftCarrier) // this will work because it's a reference comparison
Console.WriteLine("This should be true");
Как видите, у вас все еще есть безопасность типов, но гораздо больше гибкости. Это больше кода, но вы не обнаружите, что работаете против ограничений enum. Повторюсь, enum должен быть простым. Это должно быть просто. Если ваши потребности просты, не стесняйтесь использовать его. Если ваши потребности сложнее, вам не стыдно использовать старомодное объектно-ориентированное программирование для решения вашей проблемы.
EDIT
В свете вашего последнего комментария, что байтовые значения представляют количество колышков, я настоятельно рекомендую вам не использовать перечисления для решения вашей проблемы. Вы (по иронии судьбы) пытаетесь вставить круглую колышек в квадратное отверстие.