C# Assert.AreEqual对int和ulong失败,但对long和uint无效

C# Assert.AreEqual对int和ulong失败,但对long和uint无效,c#,.net,C#,.net,我希望我的处理器没有烧坏,因为: [TestMethod] public void tenEqualten() { Int64 a = 10; UInt32 b = 10; Assert.AreEqual(a, b); } 工作正常,但这: [TestMethod] public void tenNotEqualten() { Int32 a = 10; UI

我希望我的处理器没有烧坏,因为:

    [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);
    }
失败得很惨

你得到了同样的结果,还是只有我? 如果有,有什么想法,为什么? 如果这是.NET4.5的已知问题,那么对于垃圾邮件,我感到抱歉,但我无法发现这是一个bug


编辑:我发现了一个副本,解释可以转换为
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);

这与您的代码有什么关系

当您将
long
Int64
)与
uint
UInt32
)进行比较时,
uint
可以适应
long
,因此这里没有问题

但是,当您将
int
Int32
)与
ulong
UInt64
)进行比较时,您会发现没有可用的隐式加宽:它们彼此不匹配

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

最后:

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

将产生
false

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

[TestMethod]
public void tenNotEqualten()
{
  Int32 a = 10;
  UInt64 b = 10;
  Assert.AreEqual(Convert.ToUInt64(a), b);
}
此外,在使用泛型断言方法指定泛型参数以避免转换问题时,这也是一种很好的做法。下面抛出一个更可读的编译时错误:

Assert.AreEqual<UInt64>(a, b);
Assert.AreEqual(a,b);
与“Microsoft.VisualStudio.TestTools.UnitTesting.Assert.AreEqual(ulong,ulong)”匹配的最佳重载方法具有一些无效参数

参数1:无法从“int”转换为“ulong”


在您调用的第一个方法中,
Assert.AreEqual(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(预期对象,实际对象)
,但由于它们的类型不同,因此不“相等”,因此调用失败

通过将这两个数字放在
对象中,您可以使第一个版本的行为与第二个版本的行为类似,这将允许您使用相同的Assert重载

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

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

Assert.AreEqual失败。预期:。实际值:
。使用例如
Assert.AreEqual(转换为.ToUInt64(a),b)取而代之。使用框架3.5.a.Equals(b):可疑比较:解决方案中没有从“int”和“ulong”继承的类型
    [TestMethod]
    public void tenEqualten()
    {
        Int64 a = 10;
        UInt32 b = 10;
        object c = a;
        object d = b;
        Assert.AreEqual(c, d);
    }