【发布时间】:2011-08-05 15:46:03
【问题描述】:
根据msdn 枚举不能有char 的基本类型。为什么枚举不能具有 char 的基本类型?另外,为什么微软强烈建议枚举包含值为 0 的常量?非常感谢
【问题讨论】:
根据msdn 枚举不能有char 的基本类型。为什么枚举不能具有 char 的基本类型?另外,为什么微软强烈建议枚举包含值为 0 的常量?非常感谢
【问题讨论】:
您可以找到指向C# language specification 的链接。我认为限制的原因可能来自语言规范第 4.1.5 节中的这些陈述。
char 类型被归类为整数类型,但它与其他整数类型有两点不同:
没有从其他类型到 char 类型的隐式转换。特别是,即使 sbyte、byte 和 ushort 类型的值范围可以使用 char 类型完全表示,但不存在从 sbyte、byte 或 ushort 到 char 的隐式转换。
char 类型的常量必须写为字符文字或整数文字与转换为 char 类型的组合。例如,(char)10 与 '\x000A' 相同。
至于为什么为零,因为未初始化的enum的默认值为0。
【讨论】:
尽管正如您在这里看到的那样,您明确地不允许定义字符枚举,因为没有从 char 到任何其他整数类型的隐式转换,存在一个整数转换 from char 到整数,所以你可以这样做:
public enum MyCharEnum
{
BEL = 0x07,
CR = 0x0D,
A = 'A',
z = 'z'
}
并使用到字符的显式转换,因此:
MyCharEnum thing = MyCharEnum.BEL;
char ch = (char)thing;
System.Console.WriteLine(ch.ToString());
(是的,它会发出哔哔声 - 就像过去的美好时光一样!)
【讨论】:
为什么枚举不能有 char 的基本类型?
因为它并没有真正的意义(就像拥有一个基本类型的 float 没有意义一样)。在幕后,枚举是一个整数,但是由于 char 可以是任何 unicode 字符,因此实际上并没有从 char 到整数的可靠映射。
为什么微软强烈建议枚举包含一个值为 0 的常量?
因为未初始化的枚举的默认值为零(请参阅Enums should have zero value)
【讨论】:
为什么枚举不能有 char 的基本类型?
我建议这是由于 .NET 将 Chars 处理为 unicode 的方式,这意味着 Char != Byte(它的值可以大于 255)。枚举也不能基于布尔类型,这也是一个整数类型。同样使用 Char 作为基本类型会复制现有的基本类型,因此没有必要这样做。
为什么微软强烈建议枚举包含一个值为 0 的常量?
建议您始终使用等于 0 的值的原因是因为枚举是一种值类型,当创建一个新枚举时,它的值将是 0。
【讨论】: