Assert.AreEqual对int和ulong失败但不长和uint

时间:2014-11-11 22:06:39

标签: c# .net

好吧,我希望我的处理器没有被刻录,因为:

    [TestMethod]
    public void tenEqualten()
    {
        Int64 a = 10;
        UInt32 b = 10;
        Assert.AreEqual(a, b);
    }

工作得很好,但是这个:

    [TestMethod]
    public void tenNotEqualten()
    {
        Int32 a = 10;
        UInt64 b = 10;
        Assert.AreEqual(a, b);
    }

悲惨地失败了。

你有相同的结果,还是仅仅是我? 如果有,任何想法,为什么? 如果这是.Net 4.5的已知问题而不是抱歉垃圾邮件,但我找不到这是一个错误。

修改:我找到了重复的here和解释here

4 个答案:

答案 0 :(得分:10)

在第一种方法中,您调用Assert.AreEqual<T>(T expected, T actual) T的类型为Int64,这是因为UInt32可以隐式地转换为Int64。这和你做的一样

    [TestMethod]
    public void tenEqualten()
    {
        Int64 a = 10;
        UInt32 b = 10;
        Assert.AreEqual(a, (Int64)b);
    }

这就是第一个版本通过的原因。

在第二个版本中,您调用Assert.AreEqual(object expected, object actual)失败,因为它们是不同的类型,因此不是“相等”。

您可以将第一个版本设置为第二个版本,方法是将两个数字放在object内,这样可以使用相同的Assert重载。

    [TestMethod]
    public void tenEqualten()
    {
        Int64 a = 10;
        UInt32 b = 10;
        object c = a;
        object d = b;
        Assert.AreEqual(c, d);
    }

此方法的失败方式与tenNotEqualten方法失败的方式完全相同。

答案 1 :(得分:9)

请看the widening table

Integer -> Integer , Long, Decimal, Single, Double
UInteger -> UInteger , Long, ULong, Decimal, Single, Double

这与您的代码有什么关系?

当您将longInt64)与uintUInt32)进行比较时,uint可以适合long,因此没有问题这里。

但是,当您将intInt32)与ulongUInt64)进行比较时,您会发现没有可用的隐式扩展:它们不适合彼此

通过查看intellisense完成的方法解析,您可以更清楚地看到这一点:

enter image description here

enter image description here

最后:

object c = (int) 10;
object d = (ulong) 10;
Console.WriteLine (c == d);

将产生false

答案 2 :(得分:7)

UInt32可以投放到Int64,但UInt64无法投放到Int32,因为它不适合。 您将在以下示例中的c == d检查中收到编译错误。

Int64 a = 10;
UInt32 b = 10;

Console.WriteLine(a == b);

Int32 c = 10;
UInt64 d = 10;

Console.WriteLine(c == d);

答案 3 :(得分:1)

使用System.Convert.ToUInt64方法强制从Int32转换:

[TestMethod]
public void tenNotEqualten()
{
  Int32 a = 10;
  UInt64 b = 10;
  Assert.AreEqual(Convert.ToUInt64(a), b);
}

此外,使用通用Assert方法指定通用参数以避免转换问题是一种很好的做法。以下引发了更易读的编译时错误:

Assert.AreEqual<UInt64>(a, b);
  

最佳重载方法匹配&#39; Microsoft.VisualStudio.TestTools.UnitTesting.Assert.AreEqual(ulong,ulong)&#39;有一些无效的论点

     

参数1:无法转换为&#39; int&#39;到了&#39; ulong&#39;