【问题标题】:.NET Enum base type of Char.NET Enum 基本类型的 Char
【发布时间】:2011-08-05 15:46:03
【问题描述】:

根据msdn 枚举不能有char 的基本类型。为什么枚举不能具有 char 的基本类型?另外,为什么微软强烈建议枚举包含值为 0 的常量?非常感谢

【问题讨论】:

    标签: .net enums char


    【解决方案1】:

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

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

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

    • char 类型的常量必须写为字符文字或整数文字与转换为 char 类型的组合。例如,(char)10 与 '\x000A' 相同。

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

    【讨论】:

    • +1,虽然您链接到的页面不是 C# 语言规范 ;)
    • @Thomas:哎呀——让我来解决这个问题
    • @gh9:顺便说一句,这是第 11.1.5 节,而不是 4.1.5 - 哎呀
    【解决方案2】:

    尽管正如您在这里看到的那样,您明确地不允许定义字符枚举,因为没有从 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());
    

    (是的,它会发出哔哔声 - 就像过去的美好时光一样!)

    【讨论】:

      【解决方案3】:

      为什么枚举不能有 char 的基本类型?

      因为它并没有真正的意义(就像拥有一个基本类型的 float 没有意义一样)。在幕后,枚举是一个整数,但是由于 char 可以是任何 unicode 字符,因此实际上并没有从 char 到整数的可靠映射。

      为什么微软强烈建议枚举包含一个值为 0 的常量?

      因为未初始化的枚举的默认值为零(请参阅Enums should have zero value

      【讨论】:

      • @Anthony 我的意思是您可以将字节转换为整数。
      • @Kragen,你为什么说没有合适的从字符到整数或(在你的评论中)从字节到整数的映射?两者都有隐式转换,并且由于整数是 32 位,因此即使 char 与 Unicode 字符相关,溢出也没有问题。另一种方式,当然,因为一个 32 位整数可以溢出一个字符或一个字节,但这似乎不是你要说的。我确定我误会了你?
      【解决方案4】:

      为什么枚举不能有 char 的基本类型?

      我建议这是由于 .NET 将 Chars 处理为 unicode 的方式,这意味着 Char != Byte(它的值可以大于 255)。枚举也不能基于布尔类型,这也是一个整数类型。同样使用 Char 作为基本类型会复制现有的基本类型,因此没有必要这样做。

      为什么微软强烈建议枚举包含一个值为 0 的常量?

      建议您始终使用等于 0 的值的原因是因为枚举是一种值类型,当创建一个新枚举时,它的值将是 0。

      【讨论】:

      • 不确定 255 与任何事情有什么关系。毕竟,枚举的默认支持者是 int。 (不是我的反对票*)
      • 枚举可以有一个 16 位的 DOUBLE 数据类型,就像 CHAR 一样。因此,如果 ENUM 可以采用双精度,那么它就没有不能采用 CHAR 的理由。
      • 感谢您解释 0 值,我没有这么想。
      • @gh9 - 为什么投反对票?我在解释 .NET 中的 Char != Byte ,虽然它是一个整数类型,但它不能用来作为 Enum 的基础。您也不能将枚举基于布尔值,这是一个整数类型!
      • @gh9 - 该声明存在两个问题。首先,您不能使用 DOUBLE 作为枚举类型,并且 DOUBLE 是 64 位浮点数,而不是 16 位整数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多