2010-11-22 6 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; } 
    } 

referredこの問題はこれを解決するのに十分なアイデアを得ていません。

編集: 私のインスタンスが任意のタイプ(Int32、Int64、double)になるように私はリポジトリパターンを使用しています。

答えて

3

IDValueのタイプはobjectになります - PropertyInfoが少しでもよく知らないので。したがってをIDValue.Equals(0)と呼びます。それはボクシングのInt32値0 ...とのEquals(object)のオーバーライドは、それが実際にそれを比較しているInt64であることをチェックします。この場合はそうではないので、falseを返します。

他の回答によると、Equals(0L)を使用してtrueに戻します。 IDValueを強くInt64として入力された場合、それはすでに真を返すことになることを

注 - コンパイラはInt64Int32を促進、Int64.Equals(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   
    } 
} 
1

Assert.IsTrue(IDValue.Equals(0L));を試してください。

5

longintを比較しています。ボックス化されたプリミティブは、それ自体の型ではないオブジェクトと等しくないものと比較されます。これに

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

:この行を変更し

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