非唯一的枚举值

我试图掩盖edi文件中的索引位置…我有一种情况,根据情况可以在索引中find2或3个事情。 使用枚举来隐藏“魔术数字”会很酷,并且惊讶地发现可以像这样将多个枚举分配给相同的值:

public enum Color { Red = 1, Blue = 1, Green = 1 } 

编译器对此感到满意。 我没有想到这个工作。 我不需要退回到枚举,所以我并不担心试图返回,但这味道怪异。 为什么CLR允许多个枚举值,我应该使用一个结构呢? (结构似乎比枚举更重,这似乎工作)

其实你已经定义了一个结构…在幕后一个枚举只是一个结构(但是从System.Enum派生)和枚举的值被定义为常量(你可以用ILDASM来validation这一点)。

你的枚举定义转换成下面的伪C#代码:

 public struct Color : System.Enum { public const int Red = 1; public const int Blue = 1; public const int Green = 1; } 

上面的代码不会在C#中编译,因为编译器不允许定义一个具有显式基类的结构体,但这就是枚举定义所发出的结果。

由于包含多个具有相同值的常量的types没有问题,因此枚举定义没有问题。

但是由于枚举不具有唯一的值,所以在转换为此枚举时可能会遇到问题。 例如,以下两行代码将返回枚举值Red,因为第一个值是任意select的。

 Color color1 = (Color)1; Color color2 = (Color)Enum.Parse(typeof(Color), "1"); 

严格来说,枚举值不是红色,它是1,但是当你打印出来的值,你会看到红色。

此外,下面的布尔是真实的,看起来有点怪异…

 // true (Red is Green??) bool b = Color.Red == Color.Green; 

在底线这是完全合法的,但它是有道理的时候使用它的决定。

这里是直接链接到我的.NET教程的部分,讨论引擎盖下的枚举: http : //motti.me/c1E

这是完全合法的C#。 从C#语言规范版本4.0的14.3节:

多个枚举成员可能共享相同的关联值。 这个例子

 enum Color { Red, Green, Blue, Max = Blue } 

显示了一个枚举,其中两个枚举成员 – Blue和Max – 具有相同的关联值。

相同的数字值,但不同的名称是没有别的别名。 它可能是例如

 public enum Color { DefaultColor = 1, Red = 1, Blue = 2 } 

这在某些情况下可能有意义,但不是很多。 当你parsing这些值并调用colorValue.ToString()时,你会得到最后一个值作为string化的值(在这种情况下是红色的),但是由于它是相同的东西,所以你将会丢失默认颜色的值。 至less在你模型化数据的方式上。 如果你想分开使用不同的值不同的东西。

这将是一个完全可以接受的定义:

 public enum AllTheThings { TheMoney = 1, TheFreeRides = 1, TheLieThatYouDenied = 2, TheCallsYouveBeenMaking = 3, TheTimesYouveBeenFaking = 4 } 

如果你把每个枚举值看作一个常量,这是有道理的。 你没有理由不能有两个具有相同值的常量:

 public enum MyColor { Blue = 2, Yellow = 3, Green = 4 BlueAndYellow = 4, } 

是相同的:

 public enum MyColor { Blue = 2, Yellow = 3, Green = 4, BlueAndYellow = Green, } 

基本上你只是有两个不同的名称相同的常数。 BlueAndYellowGreen的别名。

有一点需要注意的是,非唯一值会导致Visual Studiodevise器中丢失和重复的值。

 public enum MyColor { Red= 1, Green= 1, Blue= 2 } 

如果您在可浏览的属性中使用此枚举,则会在devise器中看到绿色,绿色和蓝色 ,而不是红色,绿色和蓝色