枚举的意外行为

时间:2019-02-18 14:57:32

标签: c# enums

我用SHOW BINLOG EVENTS IN '<BINARY_LOG_FILE>' FROM <POSITION> LIMIT 100; 实现了一个方法,在比较值时出现了奇怪的行为。

System.Drawing.RotateFlipType

这怎么可能是真的?

3 个答案:

答案 0 :(得分:4)

canton7a comment中指出,

  

考虑一下,这是有道理的。 “指定顺时针旋转180度,然后进行水平和垂直翻转。”进行这种转换,然后回到起点。

因此,RotateFlipTypeRotateNoneFlipNoneRotate180FlipXY都具有(0)(API source)相同的值。

这在reference source中很明显(省略了XML注释):

public enum RotateFlipType
{
    RotateNoneFlipNone = 0,
    Rotate90FlipNone   = 1,
    Rotate180FlipNone  = 2,
    Rotate270FlipNone  = 3,
    RotateNoneFlipX    = 4,
    Rotate90FlipX      = 5,
    Rotate180FlipX     = 6,
    Rotate270FlipX     = 7,
    RotateNoneFlipY    = Rotate180FlipX,
    Rotate90FlipY      = Rotate270FlipX,
    Rotate180FlipY     = RotateNoneFlipX,
    Rotate270FlipY     = Rotate90FlipX,
    RotateNoneFlipXY   = Rotate180FlipNone,
    Rotate90FlipXY     = Rotate270FlipNone,
    Rotate180FlipXY    = RotateNoneFlipNone,
    Rotate270FlipXY    = Rotate90FlipNone
}

拥有重复项没有什么害处,所以我想这会使枚举的使用者对同一事物具有多个定义更加容易。

实际上,没有理由您不能为枚举值使用重复的数字值-实际上是C#语言规范says

  

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

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

显示一个枚举,其中两个枚举成员BlueMax-具有相同的关联值。

答案 1 :(得分:3)

RotateNoneFlipNoneRotateNoneFlipXY都具有值0

//
// Summary:
//     Specifies no clockwise rotation and no flipping.
RotateNoneFlipNone = 0,
//
// Summary:
//     Specifies a 180-degree clockwise rotation followed by a horizontal and vertical
//     flip.
Rotate180FlipXY = 0,

实际上它们更多,这是完全合理的。就像顺时针旋转270或逆时针旋转90一样。

答案 2 :(得分:0)