可以通过下面的代码示例(已安装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");
}
}
应启用优化功能,即csproj文件中的以下设置:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<Optimize>true</Optimize>
</PropertyGroup>
当 Optimize为假时,测试通过,但当 Optimize为真时,测试失败({{1 }}给出b2.ToString()
)。
使用 ReSharper 来运行测试或 NUnitConsole 可以看到这一点,而 VS Test Explorer 则无法再现。
这怎么解释?
答案 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中修复了。