枚举Int32类型的成员

时间:2010-09-23 00:42:13

标签: c#

  

可能重复:
  C# int, Int32 and enum's

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

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

案例1

    [Flags]
    public enum MyEnum : int
    {
        Red = 0x1,
        Green = 0x2,
        Blue = 0x4
    }

案例2

    [Flags]
    public enum MyEnum : Int32
    {
        Red = 0x1,
        Green = 0x2,
        Blue = 0x4
    }

这里有什么不同,以及当enum的成员被指定为Int32类型时,为什么C#不编译代码?

1 个答案:

答案 0 :(得分:14)

来自a Microsoft bug report here

  

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

     

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

     

这是“按设计”。

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

  2.   
  3. 虽然“Short”和“System.Int16”的基础类型是同一个,但它们并不像您假设的那样相同。 System.Int16是一个类型,Short是一个类型关键字。

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

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

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