我有这个代码:
[Flags]
public enum MyUriType {
ForParse,
ForDownload,
Unknown
}
进而:
MyUriType uriType = MyUriType.ForDownload;
但是,我想知道为什么这会返回 true:
if ((uriType & MyUriType.ForParse) == MyUriType.ForParse)
未在第二代码组中设置时。请指教。
默认情况下,enum
类型的第一个字段被赋予序数值0
。
因此,如果uriType
不包含MyUriType.ForParse
标志,则uriType & MyUriType.ForParse
实际上是 equals ,当您将其与相等性(也是)进行比较时0
,它的计算结果违反直觉。true
MyUriType.ForParse
0
如果您将其分解为按位算术,那么您正在评估的表达式是:
({something} & 0) == 0
true
...无论“某事”是什么,它总是会评估为 。
通常,当您定义一个Flags
枚举时,您实际上应该为每个字段指定值:
[Flags]
public enum MyUriTypes
{
None = 0,
ForParse = 1,
ForDownload = 2,
ForSomethingElse = 4,
ForAnotherThing = 8
}
每个值都应该是 2 的幂,这样它们就不会发生冲突(2 的每个倍数都是二进制左移)。
习惯上将其命名为复数形式,以便使用枚举的人知道它是一个Flags
枚举并且可以/应该保存多个值。
如果您以这种方式定义枚举,您的测试代码现在将评估为false
ifuriType
没有ForParse
设置该位。
你应该用 2 的幂来定义它,比如:
[Flags]
public enum MyUriType {
None = 0
ForParse = 1,
ForDownload = 2,
Unknown = 4
}
请注意,当您希望设置选项组合(例如 ForParse + Unknown 或 ForDownload + Unknown)时,标志是合适的。如果一次只适用一个选项,则可以使用常规枚举。