.NET枚举字符的基类型

.NET枚举字符的基类型,.net,enums,char,.net,Enums,Char,根据枚举,枚举不能具有字符的基类型。为什么枚举不能有字符的基类型?另外,为什么microsoft强烈建议枚举包含值为0的常量?多谢各位 为什么枚举不能有字符的基类型 我认为这是由于.NET将字符作为unicode处理,这意味着字符!=字节(其值可以大于255)。枚举也不能基于布尔类型,该类型也是整数类型。同时,使用Char作为基类型也会复制现有的基类型,因此这样做没有意义 为什么microsoft强烈建议枚举包含值为0的常量 建议您始终将值设置为0的原因是,枚举是一种值类型,创建新枚举时,其值将

根据枚举,枚举不能具有字符的基类型。为什么枚举不能有字符的基类型?另外,为什么microsoft强烈建议枚举包含值为0的常量?多谢各位

为什么枚举不能有字符的基类型

我认为这是由于.NET将字符作为unicode处理,这意味着字符!=字节(其值可以大于255)。枚举也不能基于布尔类型,该类型也是整数类型。同时,使用Char作为基类型也会复制现有的基类型,因此这样做没有意义

为什么microsoft强烈建议枚举包含值为0的常量


建议您始终将值设置为0的原因是,枚举是一种值类型,创建新枚举时,其值将为0。

您可以找到指向的链接。我认为限制的原因可能来自语言规范第4.1.5节中的这些陈述

char类型被分类为整数类型,但它与其他整数类型有两种不同:

  • 没有从其他类型到char类型的隐式转换。特别是,即使sbyte、byte和ushort类型具有可使用char类型完全表示的值范围,也不存在从sbyte、byte或ushort到char的隐式转换

  • char类型的常量必须作为字符文本或整数文本写入,并与cast to type char结合使用。例如,(char)10与'\x000A'相同

至于为什么为零,因为未初始化的
枚举的默认值为0

为什么枚举不能有字符的基类型

因为它实际上没有意义(与基本类型的float没有意义大致相同)。在封面下,枚举是一个整数,但是由于字符可以是任何unicode字符,因此实际上没有从字符到整数的有效映射

为什么microsoft强烈建议枚举包含值为0的常量


由于未初始化枚举的默认值为零(请参见)

,尽管如您在此处所见,由于不存在从字符到任何其他整数类型的隐式转换,因此不允许您定义字符枚举,但存在从字符到整数的整数转换,因此您可以执行以下操作:

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());

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

+1,尽管您链接到的页面不是C语言规范。)@托马斯:哎呀,让我来修理that@gh9:顺便说一句,这是第11.1.5节,而不是第4.1.5节-哦,我不知道255与任何事情有什么关系。毕竟,枚举的默认支持者是int。(不是我的下一票*)枚举可以有一个16位的双数据类型,就像CHAR一样。因此,如果一个枚举可以接受一个双精度值,那么它不能接受一个字符并没有什么真正的原因。感谢您解释0值,我没有这样想。@gh9-为什么要投反对票?我在.NET中解释了这一点字节,虽然它是一个整数类型,但不能用于枚举的基础。您也不能将枚举基于布尔值,而布尔值是整数类型@gh9-该声明存在两个问题。首先,您不能使用DOUBLE作为枚举的类型,而DOUBLE是64位浮点数,而不是16位整数。@Anthony我的意思是您可以将字节转换为整数。@Kragen,为什么您说没有合适的从字符到整数或(在您的注释中)从字节到整数的映射?两者都有一个隐式转换,因为整数是32位的,所以即使字符与Unicode字符相关,溢出也没有问题。当然,另一种方法是,因为32位整数可能会溢出字符或字节,但这似乎不是您要说的。我肯定我误解你了?