C#int,Int32和枚举

如果intInt32同义,为什么呢

 enum MyEnum : Int32 { Value = 1 } 

…不编译? 在哪里

 enum MyEnum : int { Value = 1 } 

会,即使鼠标hover在整数字将显示结构System.Int32?

基础types确实是相同的,但编译器依赖于types作为确切的别名。 这是基于parsing的编译错误。 我看了一下C#语法规范以及基于别名定义的基础types(例如'int','unit'…等等)。 parsing器需要整型语法规则中的特定string。

即使两个enum Enum : int意味着相同enum Enum : Int32 错误是一个parsing错误

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

即使C#规范将int关键字定义为显式别名System.Int32 ,但在parsing步骤中获取关于显式types(Int32)的这些信息仍然是个问题,因为它需要大量无法在此步骤推断的上下文信息。

熟悉的好奇心…语言规范(14.1):

枚举声明可以显式声明一个基本types的字节,sbyte,short,ushort,int,uint,long或ulong。 请注意,char不能用作基础types。 没有明确声明基础types的枚举声明的基础types为int。

但是因为int 通常只是System.Int32一个别名,所以认为两者都可以工作并不是不合理的 ,但事实并非如此。 这通常不是一个大问题,但毫不困难。