【问题标题】:C# int, Int32 and enumsC# int、Int32 和枚举
【发布时间】:2010-12-21 06:26:29
【问题描述】:

如果intInt32 的同义词,为什么

enum MyEnum : Int32
{
    Value = 1
}

...不编译?在哪里

enum MyEnum : int
{
    Value = 1
}

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

【问题讨论】:

  • 编译时的错误是什么?
  • @Donnie:需要键入 byte、sbyte、short、ushort、int、uint、long 或 ulong。显然,.Net 中的限制迫使用户在枚举中只使用关键字而不是类名。
  • 有趣。学到了一些东西,耶!
  • 这看起来像是 C# 和/或规范中的错误。我召唤 Eric Lippert 解释一下!
  • 编译器正在正确实现规范,MS 认为规范是正确的,因此它不是“错误”,只是“不直观的行为”。这意味着,不太可能很快得到修复。

标签: c# .net enums int int32


【解决方案1】:

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

该错误是一个解析错误,即使enum Enum : intenum Enum : Int32 的含义相同。

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

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

【讨论】:

  • 另见这个 MS Connect 错误,他们解释了不改变 bahvior 的理由:connect.microsoft.com/VisualStudio/feedback/details/557064/…
  • @MichaelEdenfield Microsoft Connect 链接不可访问。你可以结帐它应该是公开可见的吗?我收到此错误The content that you requested cannot be found or you do not have permission to view it. If you believe you have reached this page in error, click the Help link at the top of the page to report the issue and include this ID in your e-mail: e4c85df6-9343-4045-88d2-fc2d64bd01de
  • 不,不幸的是,它们在某些点之后会过期连接链接。该错误的要点是“int”是一个关键字,而“Int32”是一个类型,并且解析器当前期望一个有效的“关键字”作为枚举基本类型。更改行为需要更改关键字到类型替换与枚举类型解析步骤的顺序,并且对于微小的好处来说是一个很大的变化,因此它可能不会发生(除非碰巧有其他相关的变化在同一地区。)
  • 谢谢。找到一个不同的:它被标记为“不会修复”:connect.microsoft.com/VisualStudio/feedback/details/737759/…
【解决方案2】:

一种熟悉的好奇心...语言规范规定 (14.1):

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多