Int32类型的枚举成员

6

可能是重复问题:
C# int, Int32 and enum's

这可能是一个相当基础/简单的问题。我以以下方式创建枚举。

情况1可以完美编译。但情况2会抛出错误。 据我理解,在C#中,int和Int32意思相同。

情况1:

    [Flags]
    public enum MyEnum : int
    {
        Red = 0x1,
        Green = 0x2,
        Blue = 0x4
    }

案例二

    [Flags]
    public enum MyEnum : Int32
    {
        Red = 0x1,
        Green = 0x2,
        Blue = 0x4
    }

为什么C#编译代码时,如果枚举成员被指定为Int32类型,就会有所不同呢?

在这里的区别是什么?


1
重复:https://dev59.com/e3I-5IYBdhLWcg3whYsr - Brian R. Bondy
有趣的是...我以为int和Int32在编译器中完全等效,但显然并非如此。 - Thomas Levesque
1
它们根本不等价。int是一个关键字,而Int32是一个普通的标识符,恰好是在System命名空间中定义的原始类型的未限定名称。例如,我可以创建一个类MyNamespace.Int32,但MyNamespace.int是语法错误。 - Ben Voigt
你在挑刺。int是一个关键字,但它是Int32的别名。因此它们是相同的类型。即使微软承认这是“古怪”的行为,但实际上是有意设计的。 - Ed S.
1个回答

16

根据这里的一份Microsoft错误报告

症状
如果您在枚举声明中使用System.Int16/Int32/Int64而不是Short/Int/Long,则会出现编译错误。

根本原因
这是设计问题。在枚举声明中,必须使用值类型别名。

这是“按设计”。

  1. 语法正确。C#规范明确规定枚举的基础类型必须是byte、sbyte、short、ushort、int、uint、long或ulong。

  2. 尽管“Short”和“System.Int16”的基础类型相同,但它们并不像您认为的那样相同。System.Int16是一种类型,而Short是一种类型关键字。

  3. ValueType是密封的。您无法从派生自System.ValueType的任何类继承。

  4. 但是,它允许您使用该关键字进行控制。意图是防止在声明其他类型时使用派生自System.ValueType的任何类型名称。最初的意图是提供一种严格控制的机制,允许您声明从System.ValueType继承的类型。 然而,MSDN表示“C#类型关键字及其别名是可互换的”,这经常让客户感到困惑/不可解释。他们认为这是编译器或语法错误。

业务影响/客户体验
由于“Short”和“System.Int16”是相同的基础类型并可以互换,因此许多客户感到困惑/无法解释为什么在枚举声明中不能互换。他们认为这是编译器或语法错误。 客户声音: 这听起来像是一个小的编译器错误(小是因为它很容易解决)。 MSDN上写着:“C#类型关键字及其别名是可互换的。”

在我看来,这是一个真正的但微小的编译器(或语法)错误。 编译器允许你在这里使用“short”而不是“System.Int16”的事实是编译器的一个怪癖(也许不是错误,而是怪癖)。


5
“Short”不是C#中的关键字。C#是大小写敏感的语言。人们在编写错误报告时为什么如此潦草呢? - Ben Voigt
哈哈,是啊,我甚至没有注意到那个。 - Ed S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接