以下代码在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并且问题仍然存在。