C#中的字节枚举比较

mar*_*are 8 c# enums

鉴于此枚举

public enum UserStatus : byte
{
    Approved = 1,
    Locked = 2,
    Expire = 3
}
Run Code Online (Sandbox Code Playgroud)

为什么这个检查总是返回false usr.Status = 1

if(usr.Status.Equals(UserStatus.Approved))
    return true;
return false;
Run Code Online (Sandbox Code Playgroud)

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

Osk*_*lin 11

因为你必须施展.

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

更好的代码是:

return usr.Status == (int)UserStatus.Approved;
Run Code Online (Sandbox Code Playgroud)

  • 更好的方法是将`Status`声明为`UserStatus`而不仅仅是`int`.毕竟,它代表一个`UserStatus`,不是吗? (2认同)
  • 重新编写更好的代码...根据我对这个问题的评论,我建议在这里使用 `==`,因为编译器会在 `==` 上报告错误,但不会在 `Equals` 上报告错误 (2认同)

Mar*_*ell 7

任何Equals实现通常检查的第一件事是:"这是正确的类型".而且UserStatus一样的byte.

(实际上,这只是因为你通过不兼容的使用来装箱物品Equals;在IL级别它们是无法区分的,直到盒装)

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

public override bool Equals(object obj)
{
    return ((obj is byte) && (this == ((byte) obj)));
}
Run Code Online (Sandbox Code Playgroud)