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} |
使用反射时也会发生同样的情况…
那么,有人知道为什么
可能它只是一个不完整的编译器实现(尽管有文档记录)。
从技术上讲,这也应该有效,但事实并非如此。
1 2 3 4 | using x = System.Byte; public enum NodeType : x { Search, Analysis, Output, Input, Audio, Movement} |
所以编译器的解析器部分只允许使用固定列表
因为规格说明是这样说的:
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非常不同,其中枚举是一个误称,因为它们实际上被命名为单身。