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);
}