Проблема, с которой вы имеете дело, заключается в том, что вы пытаетесь заставить перечисление делать то, чего оно не должно. Они должны быть типобезопасными. Разрешается присваивать целочисленные значения перечислению, чтобы их можно было комбинировать, но если вы хотите, чтобы они представляли целочисленные значения, используйте классы или структуры. Вот возможная альтернатива:
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;
}
Вам действительно следует использовать перечисления только тогда, когда вы можете извлечь выгоду из их безопасности типов. Если вы полагаетесь на них для представления типа, переключитесь на константы или классы.
ИЗМЕНИТЬ
Я бы посоветовал вам взглянуть на страницу MSDN в разделе Дизайн перечисления. Первая лучшая практика:
Используйте перечисление, чтобы строго типизировать параметры, свойства и возвращаемые значения, представляющие наборы значений.
Я стараюсь не спорить с догмами, поэтому не буду, но вот проблема, с которой вы столкнетесь. Microsoft не хочет, чтобы вы делали то, что пытаетесь сделать. Они прямо просят вас не делать того, что вы пытаетесь сделать. Вам будет трудно делать то, что вы пытаетесь сделать. Чтобы выполнить то, что вы пытаетесь сделать, вы должны создать служебный код, чтобы заставить его работать.
Вы назвали свое решение элегантным более одного раза, и это могло бы быть, если бы перечисления были спроектированы по-другому, но поскольку перечисления такие, какие они есть, ваше решение не является элегантным. Я думаю, что камерная музыка элегантна, но если бы у музыкантов не было надлежащих инструментов и им приходилось бы играть Вивальди с пилами и кувшинами, она перестала бы быть элегантной, независимо от того, насколько талантливы они как музыканты или насколько хороша музыка. был на бумаге.
person
Michael Meadows
schedule
13.03.2009