为什么我不能以ennt关闭UInt16?

ojl*_*ecd 13 .net c#

鉴于以下代码:

static void Main()
{
    Console.WriteLine(typeof(MyEnum).BaseType.FullName);
}

enum MyEnum : ushort
{
    One = 1,
    Two = 2
}
Run Code Online (Sandbox Code Playgroud)

它输出System.Enum,这意味着这里的冒号与继承无关,它只是指定了枚举的基本类型,对不对?

但是,如果我更改我的代码如下:

enum MyEnum : UInt16
{
    One = 1,
    Two = 2
}
Run Code Online (Sandbox Code Playgroud)

我会得到一个编译错误.为什么?是不是UInt16ushort一样吗?

Ben*_*igt 12

你是正确的,反射不会报告枚举继承基类型,规范称之为"基础类型".你可以用它找到它Enum.GetUnderlyingType.

ushort和命名的类型System.UInt16完全相同.

但是,语法enum不会调用类型.相反,它需要一组有限的关键字来控制基础类型.虽然System.UInt16是有效的基础类型,但它不是C#语法允许在该位置出现的关键字之一.

引用语法:

枚举声明:

attributes opt enum-modifiers opt identifier enum-base opt enum-body optenum ;

枚举:

: 整体式

积分型:

sbyte

byte

short

ushort

int

uint

long

ulong

char


Kev*_*ker 5

因为枚举的有效类型被明确指定为整数类型(除外char).

枚举的已批准类型是byte,sbyte,short,ushort,int,uint,long或ulong.

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

人们期望UInt16它等同于ushort给定的内置类型的文档:

C#类型关键字及其别名是可互换的.例如,您可以使用以下任一声明声明整数变量...

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

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

  • 不,这是因为语法不允许在那里出现类型标识符.唯一允许的生产是*整数类型*,其选择是关键字. (2认同)