Сравнение байтового перечисления в C # - PullRequest
7 голосов
/ 06 июля 2011

Учитывая это перечисление

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

почему эта проверка всегда возвращает false когда usr.Status = 1

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

Сравнение работает - нет ошибки времени компиляции или исключения времени выполнения. Обратите внимание, что я не являюсь автором этого фрагмента кода и хотел бы узнать, почему автор выбрал перечисление типа byte и почему это не работает должным образом.

Ответы [ 3 ]

10 голосов
/ 06 июля 2011

Потому что вам придется разыгрывать.

Метод equals проверит, является ли UserStatus значением int (в зависимости от типа, который вы определили в свойстве usr.Status). Затем он вернет, который не является (он имеет тип UserStatus), таким образом, вернет false

Лучше код будет:

return usr.Status == (int)UserStatus.Approved;
7 голосов
/ 06 июля 2011

Первое, что обычно проверяет любая реализация Equals: «это правильный тип».И UserStatus - это , а не , то же самое, что и byte.

(на самом деле, это происходит только потому, что вы в штучной упаковке предметов черезваше несовместимое использование Equals; на уровне IL они неразличимы, пока в штучной упаковке)

Вы должны сравнить их как элементы того же типа .Чтобы позаимствовать код из byte:

public override bool Equals(object obj)
{
    return ((obj is byte) && (this == ((byte) obj)));
}
1 голос
/ 06 июля 2011

Это потому, что Usr.Status содержит целое число, а UserStatus.Approved возвращает строку, т. Е. Approved.Таким образом, целое число со значением 1 не может быть равно String Approved.Таким образом, вы должны преобразовать статус Enum также в целое число с помощью следующего кода

if (usr.Status == (int)(UserStatus.Approved))
                return true;
       return false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...