我是否需要将枚举转换为数字对应物?

时间:2014-07-14 11:45:23

标签: c# enums byte

我已经设置了enum这样:

public enum ServerCommands:byte {
    New = 0,
    Join = 1,
}

我想这样使用它:

byte command = buffer[0];

if (command == ServerCommands.Join) // Error: Operator == cannot be operands of type 'byte' and 'ServerCommands'.

为什么这不可能做到,我怎样才能让它发挥作用?它们都是byte类型。

3 个答案:

答案 0 :(得分:2)

您最好明确说明转化:

if (command == (byte) ServerCommands.Join)

甚至更好:

if ((ServerCommands) command == ServerCommands.Join) //always convert to the more restrictive type.

这是一种预防措施,可防止人们在不知道对象来自不同类型的情况下比较值。

平等意味着两个对象具有相同的类型。不是这种情况。 ServerCommands 从字节扩展。因此,一个字节本身不是有效的ServerCommands对象......

此外,: byte更多地用作显式编码。具有相同的二进制编码并不意味着两个对象是相同的。例如,14.25f0x41640000是二元相同的......

答案 1 :(得分:2)

您仍然需要从byte投射到ServerCommands!这不是自动完成的。在将enum转换为int或其他允许的数字类型时,将数字分配给枚举值只是为了清晰起见。


为枚举值指定数值不会将其类型更改为数字类型!您可以将任何枚举值转换为int,因为所有枚举(如果未另行声明)都可以转换为int,第一个枚举值为int0

public enum MyEnum
{
    First,
    Second
}

等于

public enum MyEnum : int
{
    First = 0,
    Second
}

如果数字不是线性的,则需要编号枚举值的功能,如:

public enum ErrorCodes: int
{
    Success = 0,
    FileNotFound = 1,
    MissingRights = 5,
    WhatTheHeck = 18
}

答案 2 :(得分:0)

您可能需要投射枚举:

if (command == (byte)ServerCommands.Join)