C# 基础类型为字节的枚举在交换机中失败

C# 基础类型为字节的枚举在交换机中失败,c#,.net,enums,switch-statement,C#,.net,Enums,Switch Statement,据 要声明另一个整数类型(如byte)的枚举,请在标识符后加冒号,后跟该类型,如以下示例所示 enum Days:byte{Sat=1,Sun,Mon,Tue,Wed,Thu,Fri} 然而,在我的.NET4.6代码中 public enum MessageIdentifier : byte { LaserRange = 0x50, }; // ...more code private void ParseMessage(byte[] fullPacket) { switch

要声明另一个整数类型(如byte)的枚举,请在标识符后加冒号,后跟该类型,如以下示例所示

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

然而,在我的.NET4.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'类型。


怎么了?我做错了什么?

使用不同的基类型声明的
enum
仍然是
enum
——也就是说,一个单独的类型,而不是其基类型的别名。除此之外,这意味着您需要显式执行基类型和
enum
类型之间的所有强制转换。换句话说,没有以下内容ng将汇编:

MessageIdentifier a = (byte)0x50;      // Does not compile
byte b = MessageIdentifier.LaserRange; // Does not compile
在您的情况下,这意味着您需要在
fullPacket[3]
表达式前面添加显式强制转换

注意:您似乎正在使用
枚举
对以字节形式发送的消息进行解码。在这种情况下,最好使用
字节
类型的常量,而不是枚举:

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

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

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

MessageIdentifier a = (byte)0x50;      // Does not compile
byte b = MessageIdentifier.LaserRange; // Does not compile
在您的情况下,这意味着您需要在
fullPacket[3]
表达式前面添加显式强制转换

注意:您似乎正在使用
枚举
对以字节形式发送的消息进行解码。在这种情况下,最好使用
字节
类型的常量,而不是枚举:

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

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

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

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

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

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

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

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

下面的代码可以工作。您需要在switch语句中强制转换枚举,因为您不是在检查枚举,而是在检查字节

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

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

下面的代码可以工作。您需要在switch语句中强制转换枚举,因为您不是在检查枚举,而是在检查字节

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

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

试着打开
(MessageIdentifier)fullPacket[3]
@Glorin:回答!试着打开
(MessageIdentifier)fullPacket[3]
@Glorin:回答!