为什么这个测试失败了?
[Test]
public void Int64Test()
{
Int64Keys ObjBigInt = new Int64Keys();
ObjBigInt.Id = 0;
PropertyInfo p = ObjBigInt.GetType().GetProperty("Id");
var IDValue = p.GetValue(ObjBigInt, null);
//var IDType = IDValue.GetType(); //returns {System.Int64}
Assert.IsTrue(IDValue.Equals(0)); //is returning false and the type if IDValue is Int64()
}
public class Int64Keys
{
public Int64 Id { get; set; }
}
public class Int32Keys
{
public Int32 Id { get; set; }
}
public class DoubleKeys
{
public double Id { get; set; }
}
我 referred 这个问题,但没有足够的想法解决这个问题。
编辑: 我正在使用Repository模式,所以我的实例可以是任何类型(Int32,Int64,double)。
答案 0 :(得分:5)
您正在将盒装long
与int
进行比较。盒装基元将与任何不完全属于其自身类型的对象进行比较。改变这一行:
Assert.IsTrue(IDValue.Equals(0));
对此:
Assert.IsTrue(IDValue.Equals(0L));
答案 1 :(得分:3)
IDValue
的类型将为object
- 因为PropertyInfo
不知道更好。因此,您为object.Equals(object)
致电IDValue.Equals(0)
。那是装载 Int32 值0 ...而Equals(object)
中Int64
的覆盖检查它确实是Int64
你正在比较它。在这种情况下,它不是,所以它返回错误。
正如其他答案所述,使用Equals(0L)
使其返回true。
请注意,如果IDValue
被强类型为Int64
,则它已经返回true - 因为编译器会更喜欢调用Int64.Equals(Int64)
,从而推广Int32
到Int64
:
using System;
class Test
{
static void Main()
{
Int64 i64 = 0L;
Console.WriteLine(i64.Equals(0)); // True
object boxed = i64;
Console.WriteLine(boxed.Equals(0)); // False
Console.WriteLine(boxed.Equals(0L)); // True
}
}
答案 2 :(得分:1)
尝试Assert.IsTrue(IDValue.Equals(0L));