根据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'类型。
怎么了?我做错了什么?
答案 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;
}
}