.NET枚举的基础类型是Char。

10
根据msdn,枚举不能拥有char作为基本类型。为什么枚举不能拥有char作为基本类型?此外,为什么微软强烈建议枚举包含一个值为0的常量?非常感谢。
4个回答

6
您可以在C#语言规范中找到链接。我认为限制的原因可能源于语言规范第4.1.5节中的以下声明。
char类型被归类为整数类型,但与其他整数类型有两点不同:
  • 没有从其他类型到char类型的隐式转换。特别地,即使sbyte、byte和ushort类型的值范围完全可以用char类型表示,也不存在从sbyte、byte或ushort到char的隐式转换。

  • char类型的常量必须写成字符字面值或整数字面值结合char类型的转换。例如,(char)10等同于'\x000A'。

至于为什么是零,因为未初始化的enum的默认值为0。

+1,尽管您链接的页面不是C#语言规范 ;) - Thomas Levesque
@Thomas:糟糕 - 让我来修复一下。 - user195488
@gh9:顺便说一下,它是第11.1.5节,而不是4.1.5节——哎呀 - user195488

3

虽然在这里,你不能定义一个字符枚举类型,因为没有从char到其他整数类型的隐式转换,但是从char到整数有一种整数转换,所以你可以使用如下方式:

public enum MyCharEnum
{
    BEL = 0x07,
    CR = 0x0D,
    A = 'A',
    z = 'z'
}

使用显式转换将其转换为char,如下:

MyCharEnum thing = MyCharEnum.BEL;
char ch = (char)thing;
System.Console.WriteLine(ch.ToString());

(是的,它会发出嘟嘟声——就像过去的好日子一样!)

2
为什么枚举类型不能以char作为基本类型?
因为这没有太多意义(与将基本类型设置为float的方式类似)。在底层,枚举是一个整数,但是由于char可以是任何Unicode字符,因此从字符到整数的映射并不是很合适。
为什么Microsoft强烈建议枚举包含一个值为0的常量?
因为未初始化枚举的默认值为零(请参阅Enums should have zero value)。

@Anthony 我的观点是你可以将一个字节转换成整数。 - Justin
@Kragen,你为什么说从char到integer或者(在你的评论中)从byte到integer没有合适的映射呢?两者之间存在隐式转换,而且由于整数是32位的,即使char与Unicode字符相关联,也不会出现溢出问题。另一方面,当然会有问题,因为32位整数可能会溢出char或byte,但这似乎不是你的意思。我肯定我误解了你的意思? - Steve Morgan

-1
为什么枚举类型不能以char作为基本类型?
我认为这是因为.NET处理字符时采用的是Unicode编码,意味着Char不等于Byte(其值可以大于255)。枚举类型也不能以布尔类型作为基本类型,因为布尔类型也是整数类型。此外,使用Char作为基本类型会重复现有的基本类型,因此没有必要这样做。
为什么微软强烈建议枚举类型包含一个值为0的常量?
之所以建议始终将一个值设为0,是因为枚举类型是值类型,当创建新的枚举实例时,它的值将为0。

1
不确定255与任何内容有关。毕竟,枚举的默认后备者是int。(不是我点的踩*) - Anthony Pegram
枚举可以具有DOUBLE数据类型,其大小为16位,就像CHAR一样。因此,如果ENUM可以使用double,则没有理由它不能使用CHAR。 - gh9
@gh9 - 为什么要点踩?我解释了在.NET中Char != Byte,虽然它是一种整数类型,但不能用来作为枚举的基础。你也不能以布尔值为基础创建枚举,而布尔值也是一种整数类型! - stevehipwell
4
那个声明有两个问题。首先,你不能将DOUBLE作为枚举类型,并且DOUBLE是64位浮点数,而不是16位整数。 - Steve Morgan
@gh9:你只能在byte、sbyte、short、ushort、int、uint、long或ulong中使用“enum”。 - user195488
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接