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

Pio*_*ski 12 .net c#

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

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

工作得很好,但这个:

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

悲惨地失败了.

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

编辑:我在这里找到了一个副本并在这里给出了解释

Sco*_*ain 10

在第一个调用Assert.AreEqual<T>(T expected, T actual)where T类型的方法中Int64,这是因为UInt32可以隐式地转换为Int64.这与你的效果相同

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

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

在第二个版本中,您调用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);
    }
Run Code Online (Sandbox Code Playgroud)

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


Jer*_*vel 9

看看扩大的桌子.

Integer -> Integer , Long, Decimal, Single, Double
UInteger -> UInteger , Long, ULong, Decimal, Single, Double
Run Code Online (Sandbox Code Playgroud)

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

当你比较long(Int64)和uint(UInt32)时,它uint可以适合long所以这里没有问题.

但是,当您使用int(Int32)和ulong(UInt64)时,您可以看到没有可用的隐式扩展:它们不适合彼此.

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

在此输入图像描述

在此输入图像描述

最后:

object c = (int) 10;
object d = (ulong) 10;
Console.WriteLine (c == d);
Run Code Online (Sandbox Code Playgroud)

会屈服 false


Mag*_*nus 7

UInt32可以被施放Int64UInt64不能被施放到Int32它不适合的地方.您将c == d在下面的示例中检查时出现编译错误.

Int64 a = 10;
UInt32 b = 10;

Console.WriteLine(a == b);

Int32 c = 10;
UInt64 d = 10;

Console.WriteLine(c == d);
Run Code Online (Sandbox Code Playgroud)