[英]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
}
我会得到一个编译错误。 为什么? UInt16
和ushort
不一样吗?
你是正确的,反射不会报告枚举继承基类型,规范称之为“基础类型”。 您可以使用Enum.GetUnderlyingType
找到它。
ushort
和System.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是正确的。 接受的列表是整数类型(除了char
) System.UInt16
与ushort
完全相同,但它不是语法指定的整数类型标识符(仅仅是结构类型)。
这是编译器错误CS1008 ,它几乎提供了答案。 枚举的已批准类型 :
枚举的已批准类型是byte,sbyte,short,ushort,int,uint,long或ulong。
你问题的第一部分是由其他人回答的,但还没有人解决过第二部分。 除OP以外的其他人已经编辑了第二个问题,我的答案可能不再适用
UInt16
和UInt
不相同, 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.