基础类型为Byte的枚举在交换机中失败

时间:2016-03-10 19:04:40

标签: c# .net enums switch-statement

根据MSDN

  

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

     

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'类型。

怎么了?我做错了什么?

3 个答案:

答案 0 :(得分:3)

虽然基础类型是byte,但在较高级别它仍然是枚举。

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

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

答案 1 :(得分:1)

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

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

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

注意:看起来您正在使用enum解码以字节形式发送的消息。在这种情况下,您可以更好地使用byte - 类型常量,而不是枚举:

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

现在您的代码将在没有显式强制转换的情况下进行编译。

答案 2 :(得分:1)

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

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

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