给定以下程序:
using System;
namespace VS2012TestApp
{
class Program
{
[Flags]
public enum IoStatus : byte
{
ControlStore = (byte)128,
Control = (byte)64,
LogicalState = (byte)32,
PhysicalState = (byte)16,
NewEdge = (byte)4,
Overload = (byte)2,
NoLoad = (byte)1,
None = (byte)0,
Notify = (byte)8,
}
private static IoStatus Status = IoStatus.LogicalState;
static void Main(string[] args)
{
Process(IoStatus.LogicalState | IoStatus.Overload, IoStatus.None);
}
private static void Process(IoStatus bitsSet, IoStatus bitsCleared)
{
bitsSet |= Status;
bitsCleared |= ~Status;
// Console.WriteLine("set {0}, clear {1}", bitsSet, bitsCleared);
bitsSet &= ~(IoStatus.LogicalState | IoStatus.PhysicalState);
bitsCleared &= ~(IoStatus.LogicalState | IoStatus.PhysicalState);
Console.WriteLine("set {0}, clear {1}", bitsSet, bitsCleared);
}
}
}
在调试模式下 Win7 x64 位的 VS2012(更新 3)中,我得到:
设置重载、清除 NoLoad、重载、NewEdge、通知、控制、ControlStore
这是我所期望的。
在发布模式下(开启和不开启优化):
设置过载,清除无
这是错误的。
目标平台 AnyCPU 或 x86 都产生相同的输出。该代码在 VS2008 中的调试和发布模式下运行良好。没试过VS2010。
编辑:在调试器中以发布模式运行它会产生正确的行为。
可以通过执行以下任何操作来修复它:
- 插入(当前已注释掉)
Console.WriteLine()
- 更改
enum
to的支持类型int
将代码更改
Process
为:private static void Process(IoStatus bitsSet, IoStatus bitsCleared) { bitsSet = (bitsSet | Status) & ~(IoStatus.LogicalState | IoStatus.PhysicalState); bitsCleared = (bitsCleared | ~Status) & ~(IoStatus.LogicalState | IoStatus.PhysicalState); Console.WriteLine("Set {0}, Clear {1}", bitsSet, bitsCleared); }
所以问题是:我们是否以非预期的方式使用枚举,只是遇到了“未定义的行为”,或者这是编译器/抖动中的错误?