使用Flag特性时出现枚举问题



我有以下枚举:

[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

如何做到这一点?

您的枚举定义等于这个

[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
}

最新更新