鉴于以下代码:
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
不一样吗?
答案 0 :(得分:12)
你是正确的,反射不会报告枚举继承基类型,规范称之为“基础类型”。您可以使用Enum.GetUnderlyingType
代替它找到它。
ushort
和System.UInt16
命名的类型完全相同。
但是,enum
的语法不需要类型。相反,它需要一组有限的关键字来控制基础类型。虽然System.UInt16
是有效的基础类型,但它不是C#语法允许在该位置出现的关键字之一。
引用the grammar:
枚举声明:
属性 opt 枚举修饰符 opt
enum
< em>标识符 enum-base opt enum-body;
选择子>枚举基:
:
整合类型整体型:
<强>
sbyte
强><强>
byte
强><强>
short
强><强>
ushort
强><强>
int
强><强>
uint
强><强>
long
强><强>
ulong
强><强>
char
强>
答案 1 :(得分: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 :(得分:3)
那是compiler error CS1008,它几乎提供了答案。枚举的approved types:
枚举的已批准类型是byte,sbyte,short,ushort,int, uint,long或ulong。
答案 3 :(得分:1)
你的问题的第一部分由其他人回答,但还没有人解决第二部分。 OP以外的其他人已经编辑了第二个问题,我的回答
UInt16
和UInt
不相同,UInt16
是无符号的16位整数,UInt
是无符号的32位整数。它们的最大值差异很大。
为了完整起见,我要包括答案。第一个问题也是:
The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.
答案 4 :(得分:1)
至于为什么?
我的猜测是符合CLS。