如果int
与Int32
同义,为什么
enum MyEnum : Int32
{
Value = 1
}
......不编译?
enum MyEnum : int
{
Value = 1
}
即使将光标悬停在int字上也会显示struct System.Int32?
答案 0 :(得分:30)
底层类型确实相同,但编译器依赖于类型作为确切的别名。这是基于解析的编译错误。我看了一下C#语法规范和那里定义的基础类型作为基于别名的标记(例如'int','unit'......等)。解析器需要来自整数类型语法规则的特定字符串。
错误是解析错误,即使enum Enum : int
和enum 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
的别名,所以不合理可能会奏效......但实际上并非如此。这通常不是一个大问题,但也很有趣。