0

给定以下程序:

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。

编辑:在调试器中以发布模式运行它会产生正确的行为。

可以通过执行以下任何操作来修复它:

  1. 插入(当前已注释掉)Console.WriteLine()
  2. 更改enumto的支持类型int
  3. 将代码更改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);
     }
    

所以问题是:我们是否以非预期的方式使用枚举,只是遇到了“未定义的行为”,或者这是编译器/抖动中的错误?

4

0 回答 0