【问题标题】:Enums with an underlying type of Byte fails in a switch具有基础类型 Byte 的枚举在开关中失败
【发布时间】:2016-03-10 19:04:40
【问题描述】:

根据MSDN

要声明另一个整数类型的枚举,例如字节,请在标识符后使用冒号,后跟类型,如下例所示。

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

但是,在我的 .NET 4.6 代码中

public enum MessageIdentifier : byte
{
    LaserRange = 0x50,
};

// ...more code

private void ParseMessage(byte[] fullPacket)
{
    switch (fullPacket[3])
    {
        case MessageIdentifier.LaserRange:
            // some wonderful code
            break;
    }
}

这无法编译。
“无法将'MessageIdentifier'类型的表达式转换为'byte'类型。

怎么了?我做错了什么?

【问题讨论】:

  • 尝试开启(MessageIdentifier)fullPacket[3]
  • @Glorin:回答这个问题!

标签: c# .net enums switch-statement


【解决方案1】:

虽然底层类型是byte,但在更高级别它仍然是一个枚举。

也就是说,您需要从byte 到您的枚举类型的显式转换:

switch ((MessageIdentifier)fullPacket[3])
{
    case MessageIdentifier.LaserRange:
        // some wonderful code
        break;
}

【讨论】:

    【解决方案2】:

    下面的代码有效。您需要在 switch 语句中转换您的枚举,因为您检查的不是枚举而是字节。

    public enum MessageIdentifier : byte
    {
        LaserRange = 0x50,
    };
    
    private static void ParseMessage(byte[] fullPacket)
    {
        switch ((MessageIdentifier)fullPacket[3])
        {
            case MessageIdentifier.LaserRange:
                // some wonderful code
                break;
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用不同基类型声明的 enum 仍然是 enum - 即单独的类型,而不是其基类型的别名。除此之外,这意味着您需要显式地 执行基本类型和enum 类型之间的所有转换。换句话说,以下都不会编译:

      MessageIdentifier a = (byte)0x50;      // Does not compile
      byte b = MessageIdentifier.LaserRange; // Does not compile
      

      在您的情况下,这意味着您需要在 fullPacket[3] 表达式前面添加显式转换。

      注意:您似乎正在使用enum 将发送的消息解码为字节。在这种情况下,您最好使用byte-typed constants,而不是枚举:

      static class MessageIdentifier {
          public const byte LaserRange = 0x50;
          ...
      }
      

      现在您的代码无需显式转换即可编译。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多