C# 基础类型为字节的枚举在交换机中失败
据 要声明另一个整数类型(如byte)的枚举,请在标识符后加冒号,后跟该类型,如以下示例所示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
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:回答!