显式转换来自int - > sbyte - >为sbyte?

时间:2014-03-19 04:09:11

标签: c#

鉴于此代码段

[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>的{​​{1}},那么它不应该识别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 ... } 投射到127但是它对sbyte投了?

1 个答案:

答案 0 :(得分:2)

这似乎是MSTest的 bug 功能。在使用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陈述明显的内容并明确地提供它,即:

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