35

如果intInt32为什么的同义词

enum MyEnum : Int32
{
    Value = 1
}

...不编译?然而

enum MyEnum : int
{
    Value = 1
}

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

4

2 回答 2

30

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

该错误是一个解析错误,即使两者enum Enum : int的含义都与enum Enum : Int32.

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

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

于 2009-11-28T19:06:30.843 回答
15

一个熟悉的好奇心......语言规范指出(14.1):

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

但是,因为int通常只是一个别名,因此认为System.Int32其中任何一个都可以工作并不是不合理的……但实际上并没有。这通常不是一个大问题,但仍然很有趣。

于 2009-11-28T19:14:22.123 回答