0

我有这个代码:

[Flags]
public enum MyUriType {
    ForParse,
    ForDownload,
    Unknown
}

进而:

MyUriType uriType = MyUriType.ForDownload;

但是,我想知道为什么这会返回 true:

if ((uriType & MyUriType.ForParse) == MyUriType.ForParse)

未在第二代码组中设置时。请指教。

4

2 回答 2

8

默认情况下,enum类型的第一个字段被赋予序数值0

因此,如果uriType不包含MyUriType.ForParse标志,则uriType & MyUriType.ForParse实际上是 equals ,当您将其与相等性(也是)进行比较时0,它的计算结果违反直觉。trueMyUriType.ForParse0

如果您将其分解为按位算术,那么您正在评估的表达式是:

({something} & 0) == 0

true...无论“某事”是什么,它总是会评估为 。

通常,当您定义一个Flags枚举时,您实际上应该为每个字段指定值:

[Flags]
public enum MyUriTypes
{
    None = 0,
    ForParse = 1,
    ForDownload = 2,
    ForSomethingElse = 4,
    ForAnotherThing = 8
}

每个值都应该是 2 的幂,这样它们就不会发生冲突(2 的每个倍数都是二进制左移)。

习惯上将其命名为复数形式,以便使用枚举的人知道它是一个Flags枚举并且可以/应该保存多个值。

如果您以这种方式定义枚举,您的测试代码现在将评估为falseifuriType没有ForParse设置该位。

于 2010-04-16T02:34:24.183 回答
0

你应该用 2 的幂来定义它,比如:

[Flags]
public enum MyUriType {
None = 0
ForParse = 1,
ForDownload = 2,
Unknown = 4
}

请注意,当您希望设置选项组合(例如 ForParse + Unknown 或 ForDownload + Unknown)时,标志是合适的。如果一次只适用一个选项,则可以使用常规枚举。

于 2010-04-16T02:38:39.853 回答