好吧,我希望我的处理器没有被刻录,因为:
[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的已知问题而不是抱歉垃圾邮件,但我找不到这是一个错误。
答案 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)
Integer -> Integer , Long, Decimal, Single, Double
UInteger -> UInteger , Long, ULong, Decimal, Single, Double
这与您的代码有什么关系?
当您将long
(Int64
)与uint
(UInt32
)进行比较时,uint
可以适合long
,因此没有问题这里。
但是,当您将int
(Int32
)与ulong
(UInt64
)进行比较时,您会发现没有可用的隐式扩展:它们不适合彼此
通过查看intellisense完成的方法解析,您可以更清楚地看到这一点:
最后:
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;