繁体   English   中英

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

[英]Why can't I base an enum off UInt16?

鉴于以下代码:

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

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

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

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

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

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

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

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

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

引用语法

枚举声明

attributes opt enum-modifiers opt enum identifier enum-base opt enum-body ; 选择

枚举

: 积分型

积分型

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

根据内置类型的文档,人们期望UInt16等同于ushort

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

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

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

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

枚举的已批准类型是byte,sbyte,short,ushort,int,uint,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合规性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM