枚举的Flags 属性允许该枚举类型的变量通过位逻辑采用多个值。这就是为什么建议每个枚举成员都有一个 2 或 0 的幂的数值。
但是,C# 不会阻止您定义一个值为 3 的成员。
这就提出了一个问题 - C# 如何组合具有数值不是 0 或 2 的成员的标志?
例如,一个普通的标志枚举会产生类似的东西(取自上面的 MSDN 链接):
// Define an Enum with FlagsAttribute.
[Flags]
enum MultiHue : short
{
None = 0,
Black = 1,
Red = 2,
Green = 4,
Blue = 8
};
static void Main( )
{
// Display all combinations of values, and invalid values.
Console.WriteLine("\nAll possible combinations of values with FlagsAttribute:");
for( int val = 0; val <= 16; val++ )
Console.WriteLine( "{0,3} - {1:G}", val, (MultiHue)val);
}
// All possible combinations of values with FlagsAttribute:
// 0 - None
// 1 - Black
// 2 - Red
// 3 - Black, Red
// 4 - Green
// 5 - Black, Green
// 6 - Red, Green
// 7 - Black, Red, Green
// 8 - Blue
// 9 - Black, Blue
// 10 - Red, Blue
// 11 - Black, Red, Blue
// 12 - Green, Blue
// 13 - Black, Green, Blue
// 14 - Red, Green, Blue
// 15 - Black, Red, Green, Blue
// 16 - 16
但是,如果我要向“MultiHue”枚举添加另一个成员,其数值为“3”,则会产生以下结果:
// Define an Enum with FlagsAttribute.
[Flags]
enum MultiHue : short
{
None = 0,
Black = 1,
Red = 2,
Lime = 3,
Green = 4,
Blue = 8
};
static void Main( )
{
// Display all combinations of values, and invalid values.
Console.WriteLine("\nAll possible combinations of values with FlagsAttribute:");
for( int val = 0; val <= 16; val++ )
Console.WriteLine( "{0,3} - {1:G}", val, (MultiHue)val);
}
0 - None
1 - Black
2 - Red
3 - Lime
4 - Green
5 - Black, Green
6 - Red, Green
7 - Lime, Green
8 - Blue
9 - Black, Blue
10 - Red, Blue
11 - Lime, Blue
12 - Green, Blue
13 - Black, Green, Blue
14 - Red, Green, Blue
15 - Lime, Green, Blue
16 - 16
请注意如何用不同的成员表示不同的组合,例如:
4 是“绿色”,但也可以是“石灰,黑色”,
7 是“石灰,绿色”,而不是之前的“黑色,红色,绿色”
等。
我知道这是一种不好的做法,但我想知道编译器如何决定将哪些成员组合用于某个位组合?