是否需要将枚举转换为对应的数值类型?

本文关键字:类型 枚举 转换 是否 | 更新日期: 2023-09-27 18:12:43

我已经设置了一个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

是否需要将枚举转换为对应的数值类型?

您仍然需要从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
}

您最好显式地声明转换:

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

或者更好:

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

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

相等意味着两个对象具有相同的类型。事实并非如此。ServerCommands extend from byte。因此,一个字节本身不是一个有效的ServerCommands对象…

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

您可能需要强制类型转换您的enum:

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