C#int,Int32和枚举
如果int
与Int32
同义,为什么呢
enum MyEnum : Int32
{
Value = 1
}
...不编译? 在哪里
enum MyEnum : int
{
Value = 1
}
即使将光标悬停在整数字上,也会显示结构System.Int32?
基础类型确实是相同的,但编译器依赖于类型作为确切的别名。 这是基于解析的编译错误。 我看了一下C#语法规范和基于别名定义的基础类型(如'int','unit'...等等)。 解析器期望整型类型语法规则中的特定字符串。
即使enum Enum : int
意味着与enum Enum : Int32
相同, 该错误仍然是解析错误 。
我不知道强制解析步骤的限制的原因,但我可以尝试猜测:由于Int32不是关键字,它可能会引用其他实际的int结构。 如果解析器必须知道类型以便为每个基类型构建不同的AST,那么它不能依赖不是关键字的令牌。
尽管C#规范将int关键字定义为显式别名System.Int32,但在解析步骤中获取关于显式类型(Int32)的这些信息仍然是个问题,因为它需要大量无法在此步骤推断的上下文信息。
熟悉的好奇心...语言规范(14.1):
枚举声明可以显式声明一个基本类型的字节,sbyte,short,ushort,int,uint,long或ulong。 请注意,char不能用作基础类型。 没有明确声明基础类型的枚举声明具有基础类型的int。
但是因为int
通常只是System.Int32
的别名,所以认为两者都可以工作并不是不合理的......但实际上并不是这样。 这通常不是一个大问题,但毫不困难。
下一篇: If Int32 is just an alias for int, how can the Int32 class use an int?