Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь заставить перечисление сделать то, чего не следует делать. Они должны быть безопасными. Присвоение целочисленных значений перечислению разрешено, так что вы можете объединять их, но если вы хотите, чтобы они представляли целочисленные значения, используйте классы или структуры. Вот возможная альтернатива:
public static class eRat
{
public static readonly eRatValue A;
public static readonly eRatValue B;
public static readonly eRatValue C;
public static readonly eRatValue D;
static eRat()
{
D = new eRatValue(8, null);
C = new eRatValue(5, D);
B = new eRatValue(3, C);
A = new eRatValue(0, B);
}
#region Nested type: ERatValue
public class eRatValue
{
private readonly eRatValue next;
private readonly int value;
public eRatValue(int value, eRatValue next)
{
this.value = value;
this.next = next;
}
public int Value
{
get { return value; }
}
public eRatValue Next
{
get { return next; }
}
public static implicit operator int(eRatValue eRatValue)
{
return eRatValue.Value;
}
}
#endregion
}
Это позволяет вам сделать это:
int something = eRat.A + eRat.B;
и это
eRat.eRatValue current = eRat.A;
while (current != null)
{
Console.WriteLine(current.Value);
current = current.Next;
}
Вы действительно должны использовать перечисления только тогда, когда вы можете извлечь выгоду из их безопасности типов. Если вы полагаетесь на то, что они представляют тип, переключитесь на константы или классы.
EDIT
Я бы посоветовал вам взглянуть на страницу MSDN Enumeration Design . Первая лучшая практика:
Использовать перечисление для строгого ввода
параметры, свойства и возврат
значения, представляющие наборы значений.
Я стараюсь не спорить с догмой, поэтому не буду, но вот проблема, с которой вы столкнетесь. Microsoft не хочет, чтобы вы делали то, что пытались сделать. Они прямо просят вас не делать то, что вы пытаетесь сделать. Вам трудно делать то, что вы пытаетесь сделать. Чтобы выполнить то, что вы пытаетесь сделать, вы должны создать служебный код, чтобы заставить его казаться работающим.
Вы называли свое решение элегантным более одного раза, и это может быть, если перечисления были разработаны по-другому, но поскольку перечисления являются тем, чем они являются, ваше решение не элегантно. Я думаю, что камерная музыка элегантна, но если бы у музыкантов не было надлежащих инструментов, и они должны были играть Вивальди с ножами и кувшинами, это уже не было бы элегантно, независимо от того, насколько они были музыкантами или хороши в музыке. был на бумаге.