为什么从byte转换为sbyte为优化代码提供了错误的值?

Mar*_*rju 15 .net c# 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");
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 该项目应该是一个类库,因为在控制台应用程序中它不可重现.
  2. 应该启用优化,即csproj文件中的以下设置:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <Optimize>true</Optimize>
    </PropertyGroup>
    
    Run Code Online (Sandbox Code Playgroud)

Optimize为false时,测试通过,但当Optimize为true(给出)时,测试失败.b2.ToString()"128"

使用ReSharper运行测试或NUnitConsole可以看到这一点,使用VS Test Explorer无法重现.

怎么解释这个?

Mar*_*rju 1

正如 @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 中修复。