На самом деле вы уже определяете структуру ... За кулисами перечисление - это просто структура (но которая происходит от System.Enum), а значения перечисления определяются как константы (вы можете проверить это с помощью ILDASM) .
Ваше определение enum преобразуется в следующий псевдо-код C #:
public struct Color : System.Enum
{
public const int Red = 1;
public const int Blue = 1;
public const int Green = 1;
}
Приведенный выше код не будет компилироваться в C #, потому что компилятор не позволяет определять структуру с явным базовым классом, но это то, что он выдает для определения перечисления.
Поскольку нет проблем с типом, который содержит несколько констант с одинаковым значением, с определением перечисления проблем не возникает.
Но так как перечисление не имеет уникальных значений, у вас может возникнуть проблема при преобразовании в это перечисление.
Например, следующие две строки кода вернут значение перечисления Red, потому что первое значение выбрано произвольно.
Color color1 = (Color)1;
Color color2 = (Color)Enum.Parse(typeof(Color), "1");
Строго говоря, значение перечисления не Red, а 1, но когда вы распечатаете значение, вы увидите Red.
Кроме того, верно следующее булево значение, которое выглядит немного странно ...
// true (Red is Green??)
bool b = Color.Red == Color.Green;
В итоге это совершенно законно, но вы можете использовать его, когда это имеет смысл ...
Вот прямая ссылка на раздел моего учебника .NET, в котором обсуждаются перечисления под капотом: http://motti.me/c1E