在最近升级到 .net 4.6 后,我们发现了 RyuJit 产生错误结果的错误,我们现在可以通过在 app.config 中添加 useLegacyJit enabled="true" 来解决这个问题。
如何调试以下生成的机器代码?
我在 VS 2015 RTM 中创建了一个新的控制台项目,设置为 Release,Any CPU,未选中 Prefer 32 bit,在连接和不连接调试器的情况下运行会产生相同的结果。
using System;
using System.Runtime.CompilerServices;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Calculate());
Console.WriteLine(Calculate());
Console.ReadLine();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Value Calculate()
{
bool? _0 = (bool?)null;
bool? _1 = (bool?)true;
if (!Value.IsPresent<bool>(_1))
{
return default(Value);
}
bool? result = null;
result = (_1.Value ? new bool?(false) : result);
if (_0.HasValue && _0.Value)
{
}
return new Value(result);
}
public struct Value
{
bool? _value;
public Value(bool? value)
{
_value = value;
}
public static bool IsPresent<T>(bool? _)
{
return _.HasValue;
}
public override string ToString()
{
return _value.ToString();
}
}
}
}
它应该产生: False False
但相反它会产生:真假
该示例的关键部分是
result = true ? false : result;
它应该总是返回 false,但从输出中可以看出,它在第一次运行该方法时返回 True,而在第二次运行该方法时返回不同的答案。从 Calculate() 方法中删除更多行将导致它始终返回 True,但给出的示例是我可以重现的最接近我们实际生产场景的示例。