调试和发布之间的C#区别

时间:2017-03-14 13:25:57

标签: c# compiler-errors

以下代码在95%的机器上产生相同的输出,但在几个机器上存在差异。在调试模式下有输出:

Changing from New to Fin
OK

但在发布模式中:

Changing from New to Fin

缺少OK行。该项目的目标是.Net 4.0,使用VS 2015构建。您可以下载完整的样本here

源代码

using System;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Status current = Values.Status;
            if (current != Next())
                Console.WriteLine("OK");
        }

        static VO Values = new VO();
        private static Status Next()
        {
            Status res = Status.Fin;
            if (Values.Status == Status.New && Values.Cond)
                res = Status.Fin;
            else if (Values.Status == Status.Fin)
                res = Status.Fin;

            Log("Changing from {0} to {1}", Values.Status, res);
            Values.Status = res;
            return res;
        }
        public static void Log(string format, params object[] args)
        {
            Console.WriteLine(format, args);
        }
    }

    public class VO
    {
        public Status Status;
        public bool Cond;
    }

    public enum Status { New, Fin }
}

这是我认为重现错误的最小版本。删除Next()中的某些条件后,内联Log方法,将Values.Cond替换为false会导致应用程序正常运行。

编辑:它与硬件无关 - 操作系统被解压缩到Hyper-V并且问题仍然存在。

1 个答案:

答案 0 :(得分:0)

基于Hans Passant's评论, clrjit.dll 版本4.6的问题仍然可以重现。升级到4.7后,它会消失。