Почему приведение от байта к sbyte дает неправильное значение для оптимизированного кода? - PullRequest
0 голосов
/ 16 октября 2018

Проблема может быть воспроизведена с помощью следующего примера кода с установленным NUnit 3.

[TestFixture]
public class SByteFixture
{
    [Test]
    public void Test()
    {
        var data = new byte[] { 0xFF };

        sbyte x = -128;
        data[0] = (byte) x;
        byte b1 = data[0];
        var b2 = (sbyte) b1;
        Assert.AreEqual(b1.ToString(), "128");
        Assert.AreEqual(b2.ToString(), "-128");
    }
}
  1. Проект должен представлять собой библиотеку классов потому что в консольном приложении оно не воспроизводится.
  2. Должна быть включена оптимизация, т. е. в файле csproj включена следующая настройка:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <Optimize>true</Optimize>
    </PropertyGroup>
    

Тест проходит , когда Оптимизация - ложь , но не проходит , когда Оптимизация верна (b2.ToString() дает "128").

Это можно увидеть, используя ReSharper для запуска теста или NUnitConsole , не воспроизводимые с VS Test Explorer .

Как это можно объяснить?

1 Ответ

0 голосов
/ 17 октября 2018

Как предположил @HansPassant, я сообщал об этой проблеме на GitHub , и, похоже, это подтвержденная ошибка.

Вот цитата по этой проблеме от mikedn

Тот факт, что вы можете воспроизводить в библиотеке классов, а не в консольном приложении, может означать, что вы используете .NET Framework, а не .NET Core.В консольных приложениях .NET Framework по умолчанию используется 32-разрядная версия, поэтому они используют устаревшую версию JIT32, а не RyuJIT.64-битные приложения .NET Framework используют RyuJIT, но обычно это более старая версия, чем та, которая используется в .NET Core.

Я могу воспроизвести эту проблему, используя 64-битную .NET Framework 4.7.2, но не текущую основную версию.NET Core.Его можно воспроизвести с помощью .NET Core 2.1, поэтому, скорее всего, это уже исправлено в master.

...