好吧,我希望我的处理器没有被烧毁,因为:
[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方法失败的方式完全相同.
看看扩大的桌子.
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
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);
Run Code Online (Sandbox Code Playgroud)