2010-11-22 55 views
3

Bu test neden başarısız oluyor?Garip Int64.Equals davranışı

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

Bunu düzeltmek için yeterli fikre kapılmasını referred bu soru değil.

Düzenleme: Repository desen kullanıyorum, örneğim herhangi bir türde olabilir (Int32, Int64, double).

cevap

3

IDValue tipi object olacak - PropertyInfo daha iyi bilmediği için. Bu nedenle IDValue.Equals(0) için object.Equals(object)'u arıyorsunuz. Bu Int32 0 değerini boks ediyor ve Int64'daki Equals(object) geçersiz kılma, gerçekten bir Int64 ile karşılaştırdığınızı kontrol ediyor. Bu durumda değil, bu yüzden yanlış dönüyor.

Diğer yanıtlarda da belirtildiği gibi, doğru olması için Equals(0L) kullanın.

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   
    } 
} 
: o zaman derleyici Int64.Equals(Int64) çağrısını tercih ediyorum, çünkü Int32 Int64 bir yükselmeden - IDValue kuvvetle Int64 olarak yazılan olsaydı, zaten doğru döndüren olacağını

Not

1

Assert.IsTrue'yi deneyin (IDValue.Equals (0L));

5

Kutulu bir long ürününü int ile karşılaştırıyoruz. Kutulu primitifler, kendi türünde olmayan herhangi bir nesneye eşit değildir. Buna

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

: Bu satırı değiştirin

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