为什么不能以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
}
我将得到一个编译错误。为什么?UInt16
和ushort
不是一样的吗?
你是正确的,反射没有报告枚举继承了基本类型,规范称之为"基础类型"。你可以用Enum.GetUnderlyingType
来代替。
ushort
和System.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
除外)。
http://msdn.microsoft.com/en-us/library/sbbt4032.aspx允许的枚举类型有:byte、sbyte、short、ushort、int、uint、long、ulong。
一个将期望UInt16
与ushort
等效,给定内建类型的文档:
c#类型关键字及其别名是可互换的。例如,您可以使用以下任意一种声明来声明一个整型变量…http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx编辑:我把这个答案弄乱了几次,没有完全掌握正确的答案。@BenVoight是对的。可接受的列表是整型(
char
除外)。System.UInt16
与ushort
的类型完全相同,但它不是由语法指定的整型标识符(仅仅是结构类型)。
这是编译器错误CS1008,它几乎提供了答案。enum的批准类型:
允许的枚举类型有:byte、sbyte、short、ushort、int、int、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遵从