关于C#:为什么只使用别名声明枚举而不使用.NET类型?

Why can you use just the alias to declare a enum and not the .NET type?

这很管用……

1
2
public  enum NodeType : byte
{ Search, Analysis, Output, Input, Audio, Movement}

这将返回一个编译器错误…

1
2
public  enum NodeType : byte
{ Search, Analysis, Output, Input, Audio, Movement}

使用反射时也会发生同样的情况…

那么,有人知道为什么enum基只是一个整型吗?


可能它只是一个不完整的编译器实现(尽管有文档记录)。

从技术上讲,这也应该有效,但事实并非如此。

1
2
3
4
using x = System.Byte;

public  enum NodeType : x
{ Search, Analysis, Output, Input, Audio, Movement}

所以编译器的解析器部分只允许使用固定列表byte, sbyte, short, ushort, int, uint, long, or ulong。我不知道有什么技术限制。


因为规格说明是这样说的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<p>
enum-declaration:<br/>
    attributes<sub>opt</sub>
    enum-modifiers<sub>opt</sub> enum identifier enum-base<sub>opt</sub>
    enum-body ;<sub>opt</sub>
</p>
<p>
enum-base:<br/>
    : integral-type
</p>
<p>
enum-body:<br/>
    { enum-member-declarations<sub>opt</sub> }<br/>
    { enum-member-declarations , }
</p>
<p>
Each enum type has a corresponding integral type called the underlying type
of the enum type. This underlying type must be able to represent all the
enumerator values defined in the enumeration. An enum declaration may
explicitly declare an underlying type of byte, sbyte, short, ushort, int, uint,
long or ulong. Note that char cannot be used as an underlying type. An enum
declaration that does not explicitly declare an underlying type has an
underlying type of int.
</p>
<p>
...
</p>

积分类型定义为,

1
2
3
4
5
6
7
8
9
10
11
12
<p>
integral-type:<br/>
    sbyte<br/>
    byte<br/>
    short<br/>
    ushort<br/>
    int<br/>
    uint<br/>
    long<br/>
    ulong<br/>
    char
</p>


byte、int32等是对象。由于枚举需要整型,而不是整型,所以会出现编译器错误。C的枚举定义在这方面更接近C。

这与Java非常不同,其中枚举是一个误称,因为它们实际上被命名为单身。