c# - 枚举的意外行为

标签 c# enums

我使用 System.Drawing.RotateFlipType 实现了一个方法,并且在比较值时出现了奇怪的行为。

System.Drawing.RotateFlipType item1 = System.Drawing.RotateFlipType.RotateNoneFlipNone;
System.Drawing.RotateFlipType item2 = System.Drawing.RotateFlipType.Rotate180FlipXY;
Console.WriteLine(item1 == item2); //true

这怎么可能是真的?

最佳答案

作为canton7a comment 中指出,

If you think about it, it makes sense. "Specifies a 180-degree clockwise rotation followed by a horizontal and vertical flip." Do that transformation in your head, and you end up back where you started.

因此,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 :

Multiple enum members may share the same associated value. The example

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

shows an enum in which two enum members—Blue and Max—have the same associated value.

关于c# - 枚举的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54749958/

相关文章:

c# - 从 MS Word 插件发送/接收 http 请求/响应

java - 从 json 反序列化到包含枚举的对象的问题

C# TypeConverter long 到枚举类型在 ChangeType 上失败

java - 枚举与简单常量声明?

c# - 为什么UserControl文本 block 在设计模式下振动

c# - 代码片段快捷方式并不适用于所有地方

c# - 如何将参数传递给进程

c# - 如何使用 sessionid 和 response 对象打开一个新页面

c# - 将枚举属性值绑定(bind)到 ListView.Items(WinForms)

Java:枚举中的异常?