奇怪的Int64.Equals行为

时间:2010-11-22 07:36:18

标签: c# types

为什么这个测试失败了?

    [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)。

3 个答案:

答案 0 :(得分:5)

您正在将盒装longint进行比较。盒装基元将与任何不完全属于其自身类型的对象进行比较。改变这一行:

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),从而推广Int32Int64

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