C# 位标志始终包含0值
所以我是通过这个密码来的:C# 位标志始终包含0值,c#,enums,bitflags,C#,Enums,Bitflags,所以我是通过这个密码来的: [Flags] public enum Options { NA = 0, OptionA = 1, OptionB = 2, OptionC = 4 } 现在,从技术上讲,“NA”是无效的,如果用户不想选择任何选项,他们就不会选择任何选项,它将保存为可为null的int。没有“None”选项。然而,每当用户选择选项A-C时,NA也总是会被添加。如果我更改了NA=1,然后更改了OptionC=8,则一切正常。这一部分是有道理的。但是,
[Flags]
public enum Options
{
NA = 0,
OptionA = 1,
OptionB = 2,
OptionC = 4
}
现在,从技术上讲,“NA”是无效的,如果用户不想选择任何选项,他们就不会选择任何选项,它将保存为可为null的int。没有“None”选项。然而,每当用户选择选项A-C时,NA也总是会被添加。如果我更改了NA=1,然后更改了OptionC=8,则一切正常。这一部分是有道理的。但是,如果NA=0
,为什么NA总是包含在用户的选项列表中
编辑:
要清除某些内容,NA是独占的,但如果我在何处选择OptionB,那么当我查看所选选项时,它将显示我选择的NA和OptionB。当您在枚举上添加
标志作为属性,并且值为0时,如果您使用&
筛选值,它将始终包含在内
这是因为所有必需的位(在这种情况下没有)都始终设置。当您在枚举上添加标志作为属性,并且值为0时,如果您使用&
筛选出值,它将始终包括在内
这是因为所有必需的位(在这种情况下为无)总是被设置的。如果要使用带有标志的枚举,那么只有当您有一个排除所有其他选项(例如none
)的选项时,才使用值0。然后用以下方法进行测试:
if (myOptions == Options.Na)
使用以下各项进行测试:
if ((myOptions & Options.Na) == Options.Na)
当然,将始终返回true
现在名称Na
表明它排除了所有其他选项,那么问题出在哪里呢?如果要使用带有Flags
属性的枚举,那么只有在具有排除所有其他选项(例如None
)的选项时才使用值0。然后用以下方法进行测试:
if (myOptions == Options.Na)
使用以下各项进行测试:
if ((myOptions & Options.Na) == Options.Na)
当然,将始终返回true
现在名称Na
表明它排除了所有其他选项,那么问题出在哪里?您所说的“Na也总是会被添加”是什么意思?在什么意义上?@JLRishe:我猜OP是在做类似于myOpt&Options.NA==Options.NA的事情,当然,这永远都是真的。这就是为什么一开始就测试它是没有意义的。如果您想测试Options.NA
,那么您只需要myOpt==Options.NA
。您所说的“NA也总是会被添加”是什么意思?在什么意义上?@JLRishe:我猜OP是在做类似于myOpt&Options.NA==Options.NA的事情,当然,这永远都是真的。这就是为什么一开始就测试它是没有意义的。如果您想测试Options.NA
,那么只需要myOpt==Options.NA
。