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

时间:2011-10-28 03:46:08

标签: c# .net

鉴于以下代码:

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不一样吗?

5 个答案:

答案 0 :(得分:12)

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

ushortSystem.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.UInt16ushort的类型完全相同,但它不是指定的整数类型标识符(仅仅是结构类型)通过语法

答案 2 :(得分:3)

那是compiler error CS1008,它几​​乎提供了答案。枚举的approved types

  

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

答案 3 :(得分:1)

你的问题的第一部分由其他人回答,但还没有人解决第二部分。 OP以外的其他人已经编辑了第二个问题,我的回答可能不再适用

UInt16UInt不相同,UInt16是无符号的16位整数,UInt是无符号的32位整数。它们的最大值差异很大。

为了完整起见,我要包括答案。第一个问题也是:

The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

答案 4 :(得分:1)

至于为什么?

我的猜测是符合CLS。