为什么不能以UInt16作为枚举的基数?

本文关键字:枚举 不能 UInt16 为什么 | 更新日期: 2023-09-27 18:12:50

给定下面的代码:

static void Main()
{
    Console.WriteLine(typeof(MyEnum).BaseType.FullName);
}
enum MyEnum : ushort
{
    One = 1,
    Two = 2
}

输出System。Enum,这里的冒号与继承无关,它只是指定了Enum的基本类型,对吗?

但是如果我这样修改代码:

enum MyEnum : UInt16
{
    One = 1,
    Two = 2
}

我将得到一个编译错误。为什么?UInt16ushort不是一样的吗?

为什么不能以UInt16作为枚举的基数?

你是正确的,反射没有报告枚举继承了基本类型,规范称之为"基础类型"。你可以用Enum.GetUnderlyingType来代替。

ushortSystem.UInt16命名的类型完全相同。

但是,enum的语法不调用类型。相反,它调用控制底层类型的一组有限关键字中的一个。虽然System.UInt16是一个有效的底层类型,但它不是c#语法允许出现在该位置的关键字之一。

引用语法:

enum-declaration :

<

属性/em> <子>选择 enum-modifiers <子>选择 enum 标识符 enum-base <子>选择 enum-body ; <子>选择

enum-base :

: 整体式

整体式:

sbyte

byte

short

ushort

int

uint

long

ulong

char

因为枚举的有效类型被显式指定为整型(char除外)。

允许的枚举类型有:byte、sbyte、short、ushort、int、uint、long、ulong。

http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

一个期望UInt16ushort等效,给定内建类型的文档:

c#类型关键字及其别名是可互换的。例如,您可以使用以下任意一种声明来声明一个整型变量…

http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx

编辑:我把这个答案弄乱了几次,没有完全掌握正确的答案。@BenVoight是对的。可接受的列表是整型(char除外)。System.UInt16ushort的类型完全相同,但它不是由语法指定的整型标识符(仅仅是结构类型)。

这是编译器错误CS1008,它几乎提供了答案。enum的批准类型:

允许的枚举类型有:byte、sbyte、short、ushort、int、int、long或ulong

你的问题的第一部分已经被别人回答了,但是还没有人回答第二部分。 OP以外的人已经编辑了第二个问题,我的答案可能不再适用

UInt16UInt不一样,UInt16是16位无符号整数,UInt是32位无符号整数。它们的最大值相差很大。

为了完整起见,我将问题的答案包括在内。第一个问题:

The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

为什么?

我猜是CLS遵从