gpt4 book ai didi

c# - 从 int -> sbyte -> sbyte 的显式转换?

转载 作者:行者123 更新时间:2023-11-30 12:28:17 25 4
gpt4 key购买 nike

给定这段代码

[TestMethod]
public void SByte()
{
int integerValue = -129;
sbyte sbyteValueFromInt = (sbyte) integerValue;
Assert.AreEqual(sbyteValueFromInt, 127); // True

byte byteValue = (byte) integerValue;
sbyte sbyteValueFromByte= (sbyte) byteValue;
Assert.AreEqual(sbyteValueFromByte, 127); // True

sbyte? nullableSbyte = sbyteValueFromByte;
Assert.AreEqual(nullableSbyte.Value, 127); // True
Assert.AreEqual((sbyte)nullableSbyte, 127); // True
Assert.AreEqual(nullableSbyte, 127); // Assert.AreEqual failed. Expected:<127 (System.SByte)>. Actual:<127 (System.Int32)>.
}

为什么最后一个断言失败了?

如果我们深入研究 AreEqual<object>MSTest那它不应该识别127吗?转换为 sbyte?

Assert.AreEqual<object>(expected, actual, message, parameters);

public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
message = Assert.CreateCompleteMessage(message, parameters);
if (object.Equals((object) expected, (object) actual))
return;
Assert.HandleFailure ...
}

它怎么不知道怎么投127sbyte但它做到了sbyte?

最佳答案

这似乎是 MSTest 的一个错误功能。当使用 NUnit 重复测试,或仅使用 operator == 时,隐式转换是有效的。

MSTest 的断言归结为:

Assert.AreEqual<object>(expected, actual, message, parameters);

public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
message = Assert.CreateCompleteMessage(message, parameters);
if (object.Equals((object) expected, (object) actual))
return;
Assert.HandleFailure ...
}

通过 object 过早装箱可能是罪魁祸首。

要解决这个问题,您必须向 MSTest 说明显而易见的内容,并明确地为它提供 T,即:

Assert.AreEqual<sbyte?>(nullableSbyte, 127);

然后通过。

相比之下,NUnit Assert 无需任何帮助即可通过:

    [Test]
public void SByte()
{
sbyte? nullableSbyte = sbyteValueFromByte;
Assert.AreEqual(nullableSbyte.Value, 127); // True
Assert.AreEqual(nullableSbyte, 127);
}

就像穷人的单元测试一样:

    sbyte? nullableSbyte = sbyteValueFromByte;
if (nullableSbyte.Value != 127)
{
throw new Exception("Not Equal");
}
if (nullableSbyte != 127)
{
throw new Exception("Not Equal");
}

编辑

R# comparison

关于c# - 从 int -> sbyte -> sbyte 的显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22496022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com