如果int
是Int32
为什么的同义词
enum MyEnum : Int32
{
Value = 1
}
...不编译?然而
enum MyEnum : int
{
Value = 1
}
即使将光标悬停在 int 单词上也会显示 struct System.Int32?
底层类型确实是相同的,但编译器依赖于类型作为确切的别名。这是基于解析的编译错误。我查看了 C# 语法规范以及在那里定义为基于别名的标记的基础类型(例如,'int'、'unit'...等)。解析器需要来自整数类型语法规则的特定字符串。
该错误是一个解析错误,即使两者enum Enum : int
的含义都与enum Enum : Int32
.
我不知道强制此限制解析步骤的原因,但我可以尝试猜测:由于 Int32 不是关键字,它可能引用其他实际 int 结构。如果解析器必须知道类型才能为每种基本类型构建不同的AST,那么它就不能依赖不是关键字的令牌。
尽管 C# 规范将int关键字定义为显式别名System.Int32,但在解析步骤期间获取有关显式类型 (Int32) 的信息仍然是一个问题,因为它需要大量在此步骤中无法推断的上下文信息。
一个熟悉的好奇心......语言规范指出(14.1):
枚举声明可以显式声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 的底层类型。请注意,char 不能用作基础类型。未显式声明基础类型的枚举声明具有 int 基础类型。
但是,因为int
通常只是一个别名,因此认为System.Int32
其中任何一个都可以工作并不是不合理的……但实际上并没有。这通常不是一个大问题,但仍然很有趣。