C#中的字节枚举比较

时间:2011-07-06 12:26:23

标签: c# enums

鉴于此枚举

public enum UserStatus : byte
{
    Approved = 1,
    Locked = 2,
    Expire = 3
}

为什么在usr.Status = 1

时,此检查始终返回false
if(usr.Status.Equals(UserStatus.Approved))
    return true;
return false;

比较似乎有效 - 没有编译时错误或运行时异常。请注意我不是这段代码的作者,并且想知道为什么作者选择byte类型的枚举以及为什么它不能正常工作。

3 个答案:

答案 0 :(得分:10)

因为你必须施展。

equals方法将检查UserStatus是否为int(取决于您在属性usr.Status中定义的类型)。然后它将返回不是(它的类型为UserStatus)因此返回false

更好的代码是:

return usr.Status == (int)UserStatus.Approved;

答案 1 :(得分:7)

任何Equals实现通常检查的第一件事是:“这是正确的类型”。 UserStatus byte相同。

(实际上,这只是因为您通过不兼容的Equals使用装箱项目而发生;在IL级别,它们无法区分,直到装箱)

您必须将它们作为相同类型的进行比较。借用byte中的一些代码:

public override bool Equals(object obj)
{
    return ((obj is byte) && (this == ((byte) obj)));
}

答案 2 :(得分:1)

这是因为Usr.Status包含一个整数,UserStatus.Approved返回一个字符串,即Approved。因此,值1的整数不能等于字符串Approved。因此,您必须通过以下代码将Enum状态转换为整数

if (usr.Status == (int)(UserStatus.Approved))
                return true;
       return false;