为什么可以只使用别名来声明枚举,而不使用.NET类型

本文关键字:类型 NET 枚举 别名 为什么 声明 | 更新日期: 2023-09-27 18:30:03

这非常有效

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

这将返回一个编译器错误

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

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

那么,有人知道为什么enum-基只是一个积分类型吗?

为什么可以只使用别名来声明枚举,而不使用.NET类型

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

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

using x = System.Byte;
public  enum NodeType : x
{ Search, Analysis, Output, Input, Audio, Movement}

因此,编译器的解析器部分只允许使用固定列表byte, sbyte, short, ushort, int, uint, long, or ulong。据我所知,没有任何技术限制。

因为规范这么说:

      

枚举声明:
属性opt枚举修饰符枚举体opt

枚举基:
:整体式

枚举主体:
{枚举成员声明opt
{枚举成员声明,}

每个枚举类型都有一个对应的整数类型,称为底层类型枚举类型的。此基础类型必须能够表示枚举中定义的枚举器值。枚举声明可以显式声明byte、sbyte、short、ushort、int、uint的底层类型,很长或很长。请注意,char不能用作基础类型。枚举未显式声明基础类型的声明具有内部的基本类型

积分类型定义为,

      

积分类型:
sbyte
字节

ushort
int
uint

ulong
字符

Byte、Int32等都是对象。由于枚举需要积分类型,而这些类型不是,因此会出现编译器错误。C#的枚举定义在这方面更接近于C。

这与Java非常不同,在Java中,枚举是用词不当的,因为它们实际上被命名为singleton。