C#int,Int32和enums

时间:2009-11-28 18:58:06

标签: c# .net enums int int32

如果intInt32同义,为什么

enum MyEnum : Int32
{
    Value = 1
}

......不编译?

enum MyEnum : int
{
    Value = 1
}

即使将光标悬停在int字上也会显示struct System.Int32?

2 个答案:

答案 0 :(得分:30)

底层类型确实相同,但编译器依赖于类型作为确切的别名。这是基于解析的编译错误。我看了一下C#语法规范和那里定义的基础类型作为基于别名的标记(例如'int','unit'......等)。解析器需要来自整数类型语法规则的特定字符串。

错误是解析错误,即使enum Enum : intenum Enum : Int32都相同。

我不知道强制这个限制解析步骤的原因,但我可以尝试猜测:由于Int32不是关键字,它可能引用其他实际的int结构。如果解析器必须知道类型以便为每个基类型构建不同的AST,那么它不能依赖于不是关键字的令牌。

即使C#规范将 int 关键字定义为显式别名 System.Int32 ,在解析过程中获取有关显式类型(Int32)的信息仍然是个问题因为它需要大量的上下文信息,因此无法在此步骤中推断出来。

答案 1 :(得分:14)

一种熟悉的好奇心......语言规范陈述(14.1):

  

枚举声明可以显式声明基础类型的byte,sbyte,short,ushort,int,uint,long或ulong。请注意,char不能用作基础类型。未明确声明基础类型的枚举声明的基础类型为int。

但由于int 一般 只是System.Int32的别名,所以不合理可能会奏效......但实际上并非如此。这通常不是一个大问题,但也很有趣。