После обновления до .net 4.6 мы обнаружили ошибку, в которой RyuJit выводит неверные результаты, теперь мы смогли обойти эту проблему, добавив в app.config useLegacyJit enabled = "true".
Как я могу отладить машинный код, сгенерированный следующим?
Я создал новый консольный проект в VS 2015 RTM, настроен на Release, любой CPU, unchecked Предпочитаю 32 бит, работающий с приложением отладчика и без него, дает тот же результат.
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, но приведенный ниже пример является самым близким, который я мог бы воспроизвести в нашем фактическом сценарии производства.