2010-11-22 48 views
3

爲什麼這個測試失敗?奇怪的Int64.Equals行爲

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

I referred這個問題,但沒有得到足夠的想法來解決這個問題。

編輯: 我正在使用Repository模式,所以我的實例可以是任何類型(Int32,Int64,double)。

回答

3

類型的IDValueobject - 因爲PropertyInfo不知道任何好轉。您因此致電object.Equals(object),致電IDValue.Equals(0)。這是拳擊的Int32值0 ...和覆蓋Equals(object)Int64檢查它確實是一個Int64你比較。在這種情況下,它不是,所以它返回false。

正如其他答案所述,使用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   
    } 
} 
1

Try Assert.IsTrue(IDValue.Equals(0L));

5

您正在比較盒裝longint。盒裝原語將比較不等於任何不完全屬於它自己類型的對象。改變這一行:

Assert.IsTrue(IDValue.Equals(0)); 

要這樣:

Assert.IsTrue(IDValue.Equals(0L));