C#中的字节枚举比较
鉴于此枚举
public enum UserStatus : byte { Approved = 1, Locked = 2, Expire = 3 }
当usr.Status = 1
时,为什么这个检查总是返回false
if(usr.Status.Equals(UserStatus.Approved)) return true; return false;
比较似乎有效 – 没有编译时错误或运行时exception。 请注意我不是这段代码的作者,并且想知道为什么作者选择了byte
类型的枚举以及为什么它不能正常工作。
因为你必须施展。
equals方法将检查UserStatus
是否为int
(取决于您在属性usr.Status
定义的类型)。 然后它将返回不是(它是UserStatus
类型)因此返回false
更好的代码是:
return usr.Status == (int)UserStatus.Approved;
任何Equals实现通常检查的第一件事是:“这是正确的类型”。 而UserStatus
与byte
。
(实际上,这只是因为您通过不兼容的Equals
使用来装箱物品;在IL级别,它们无法区分,直到装箱)
您必须将它们作为相同类型的项目进行比较。 从byte
借用一些代码:
public override bool Equals(object obj) { return ((obj is byte) && (this == ((byte) obj))); }
这是因为Usr.Status
包含一个Integer, UserStatus.Approved
返回一个String,即Approved
。 因此,值1
的整数不能等于Approved
的字符串。 因此,您必须通过以下代码将Enum状态转换为整数
if (usr.Status == (int)(UserStatus.Approved)) return true; return false;