Ошибка перечисления при использовании атрибута Flag - PullRequest
0 голосов
/ 18 января 2019

У меня ниже перечисления:

[Flags]
public enum ElementsTag
{
    None,
    Surname,
    SecondSurname,
    Forenames,
    PersonalNumber,
    Birthday,
    Nationality,
    DocumentExpirationDate,
    DocumentNumber,
    Sex,
    CityOfBirth,
    ProvinceOfBirth,
    ParentsName,
    PlaceOfResidence,
    CityOfResidence,
    ProvinceOfResidence
}

Итак, когда я пытаюсь передать значение перечисления методу в качестве параметра, как показано ниже:

this.GetDataElementFromByteArray((byte[])aData, ElementsTag.ParentsName);

В отладке я вижу, что ElementsTag.ParentsName содержит значение:

PersonalNumber | DocumentNumber 

Вместо того, чтобы содержать только ParentsName. Это также происходит с другими членами перечисления, например, при переходе к методу ElementsTag.Nationality содержит:

Nationality = SecondSurname | PersonalNumber

Почему?

Я бы хотел, чтобы каждый член перечисления содержал только свое собственное значение, а не другие, например:

ElementsTag.ParentsName = ParentsName
ElementsTag.Nationality = Nationality

Как это сделать?

1 Ответ

0 голосов
/ 18 января 2019

Ваше определение перечисления равно этому

[Flags]
public enum ElementsTag
{
    None = 0,
    Surname = 1,
    SecondSurname = 2,
    Forenames = 3,
    PersonalNumber = 4,
    Birthday = 5,
    Nationality = 6,
    DocumentExpirationDate = 7,
    DocumentNumber = 8,
    Sex = 9,
    CityOfBirth = 10,
    ProvinceOfBirth  = 11,
    ParentsName = 12,
    PlaceOfResidence = 13,
    CityOfResidence = 14,
    ProvinceOfResidence = 15
}

Если вы передаете ElementsTag.ParentsName, используется значение 12. В двоичной записи 12 = 0000 1100. Поэтому устанавливается 3-й и 4-й бит. 3-й бит соответствует значению 4, которое равно ElementsTag.PersonalNumber, а 4-й бит соответствует значению 8, которое соответствует ElementsTag.DocumentNumber.

Если вы хотите отличительные значения, вы должны использовать 2 ^ n значений, например, так:

[Flags]
public enum ElementsTag
{
    None = 0,
    Surname         = 1,
    SecondSurname   = 1 << 1, // 2
    Forenames       = 1 << 2,  // 4
    PersonalNumber  = 1 << 3, // 8
    Birthday        = 1 << 4,
    Nationality     = 1 << 5,
    DocumentExpirationDate = 1 << 6,
    DocumentNumber         = 1 << 7,
    Sex                    = 1 << 8,
    CityOfBirth            = 1 << 9,
    ProvinceOfBirth        = 1 << 10,
    ParentsName            = 1 << 11,
    PlaceOfResidence       = 1 << 12,
    CityOfResidence        = 1 << 13,
    ProvinceOfResidence    = 1 << 14
}
...