为什么从字节到字节的转换为优化代码给出了错误的值?

时间:2018-10-16 14:43:29

标签: c# .net casting

可以通过下面的代码示例(已安装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>
    

Optimize为假时,测试通过,但当 Optimize为真时,测试失败({{1 }}给出b2.ToString())。

使用 ReSharper 来运行测试或 NUnitConsole 可以看到这一点,而 VS Test Explorer 则无法再现。

这怎么解释?

1 个答案:

答案 0 :(得分:1)

如@HansPassant所建议,我已在GitHub上报告了此问题,这似乎是一个已确认的错误。

以下是mikedn

对此问题的引用
  

您可以在类库而不是控制台中进行复制的事实   应用程序可能意味着您使用的是.NET Framework,而不是.NET   核心。在.NET Framework控制台中,应用程序默认为32位,因此它们使用   旧版JIT32,而不是RyuJIT。 64位.NET Framework应用程序使用RyuJIT,但   它通常是比.NET Core使用的版本更旧的版本。

     

我可以使用64位.NET Framework 4.7.2重现此问题,但不能   .NET Core的当前主版本。可以使用复制   .NET Core 2.1,因此很可能已经在master中修复了。