枚举Int32类型的成员

Sar*_*gam 6 c#

可能重复:
C#int,Int32和enum

这可能是一个相当基本/简单的问题,我正在通过以下方式创建枚举.

案例1编译完美.但案例2引发了错误.我理解int和Int32在C#中的含义相同.

情况1

    [Flags]
    public enum MyEnum : int
    {
        Red = 0x1,
        Green = 0x2,
        Blue = 0x4
    }
Run Code Online (Sandbox Code Playgroud)

案例2

    [Flags]
    public enum MyEnum : Int32
    {
        Red = 0x1,
        Green = 0x2,
        Blue = 0x4
    }
Run Code Online (Sandbox Code Playgroud)

这里的区别是什么以及当enum的成员被指定为Int32类型时C#不编译代码的原因是什么?

Ed *_* S. 14

来自Microsoft错误报告:

症状
如果使用System.Int16/Int32/Int64而不是Short/Int/Long来声明Enum,则会出现编译错误.

根本原因
这是设计的.在Enum声明中确实需要使用值类型别名.

这是"按设计".

  1. 语法是正确的.C#规范明确声明枚举的底层类型必须是byte,sbyte,short,ushort,int,uint,long或ulong.

  2. 虽然"Short"和"System.Int16"的基础类型是同一个,但它们并不像你想象的那样相同.System.Int16是一个类型,Short是一个类型关键字.

  3. ValueType已密封.您不能从任何派生自System.ValueType的类继承.

  4. 但是,它允许您使用关键字来控制.目的是防止在声明其他类型时使用从System.ValueType派生的任何类型的名称.最初的目的是提供一种严格控制的机制,允许您声明从System.ValueType继承的类型.但是,MSDN说"C#类型关键字及其别名是可以互换的",这通常会让客户感到困惑/莫名其妙.他们认为这是编译器或语法错误.

业务影响/客户体验
由于"Short"和"System.Int16"是相同的基础类型并且可以互换,因此许多客户感到困惑/无法理解为什么它在Enum声明中无法互换.他们认为这是编译器或语法错误.客户的声音:这听起来像一个小的编译器错误(小,因为它易于解决).以下是MSDN所说的"C#类型关键字及其别名是可以互换的." 在我看来,这是一个真实但很小的编译器(或可能是语法)错误.编译器允许你在这里使用"short"而不是"System.Int16"的事实是编译器的一个怪癖(也许不是bug,而是一个怪癖).

  • 只有..."短"不是关键字(在C#中).C#是一种区分大小写的语言.在撰写错误报告时,为什么人们如此草率? (5认同)