2016-11-18 9 views
1

をオブジェクトへのオブジェクトを比較してください。私は2つの変数を持つ

私が試してみました:

var a = Id.Equals(selectedValue); 
var b = Id == selectedValue; 
var c = Object.Equals(Id, selectedValue); 
var d = var x = Object.Equals((Object)Id, (Object)selectedValue); 

しかし、すべてはfalseを返します。


更新IDはtypeof Int64ですか? selectedValueはInt32ですか?しかし、==演算子はInt64で動作しますか?とInt32?

+2

dataValueField' 'の種類は何ですか? 'itemType'と' item'のクラスをペーストできますか? – kha

+0

Id値をintにキャストして比較してみませんか? –

答えて

2

データ型に問題はありますか値ではないことは間違いありません。たとえば、0L(long)と値0の整数を使用する場合、等価性をチェックするすべての方法はfalseを返します。両方が同じタイプ(int)の場合、それは機能します。

+0

IDはInt64の型ですか? selectedValueはInt32ですか?しかし、==演算子はInt64で動作しますか?とInt32? –

+0

いいえ、この方法ではありません。 'bool x = object.Equals((オブジェクト)0、(オブジェクト)0L)'はfalseを返します。 'bool x = object.Equals((object)0、(object)0)'は真を返します。 –

+0

はい、同意しました。しかし、私はObject.Equals()についてではなく、==演算子について話しています。 ==演算子はInt64で正常に動作しますか?とInt32? –

3

インスタンスとそれが異なる理由を比較しています。 objectを使用する必要がありますか?それをintにキャストできますか?

カスタムクラスを使用して、Equals()と演算子==を上書きできます。 見る:https://msdn.microsoft.com/en-us/library/ms173147.aspx

私はそれが役に立ちそうです。

+0

はい、同意しました。しかし、IdとselectedValueもString型でなければなりません。実際には関数内のオブジェクト型のパラメータであり、この関数で任意の型の値を渡すことができます –

+0

汎用にすることは可能ですか? (https://msdn.microsoft.com/en-us/library/512aeb7t.aspx) – zanseb

+0

これは次のように書くことができます: 'int Id = itemType.GetProperty(dataValueField).GetValue (item、null);' – zanseb

2

IdはInt64のタイプですか? selectedValueはInt32ですか?しかし、==演算子はInt64で動作しますか?とInt32?

Int64? Id = 0; 
Int32? selectedValue = 0; 

Console.WriteLine(Id == selectedValue); // indeed true 

はしかし、あなたのタイプはobjectsあるので、あなたは何を実際に起こることは、オブジェクトの比較であることを心に留めておく必要があります::

object IdAsObject = Id; 
object selectedValueAsObject = selectedValue; 

Console.WriteLine(IdAsObject.Equals(selectedValueAsObject)); 
Console.WriteLine(IdAsObject == selectedValueAsObject); 
Console.WriteLine(Object.Equals(IdAsObject, selectedValueAsObject)); 
Console.WriteLine(Object.Equals((Object)IdAsObject, (Object)selectedValueAsObject)); 
あなたはこれらのタイプが適切に比較することを右です

これらはすべて同じオブジェクトであれば2つのオブジェクトが等しいため、すべてfalseです。

値を比較する場合は、適切なタイプを使用するようにしてください。

+0

IDとselectedValueをInt64にキャストする必要がありますか?とInt32?この後にそれらを比較しますか?解決策はありませんか? –

+0

このステートメントは正しくありません: '2つのオブジェクトは同じオブジェクトの場合にのみ等しいためです.' 'Equals'メソッドはInt32とInt64でオーバーライドされています。ここでの問題は、オーバーライドが最初に型チェックを行い、Int32の型がInt64と同じではないことです。今すぐ参照してください:http://www.dotnetframework.org/default.aspx/[email protected]/[email protected]/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/[email protected]/1305376/Int64 @ cs。自分でチェックしたい場合は、 'Id'と' selectedValue'を 'int32'(オブジェクトにキャスト)に変更し、' idAsObect.Equals(selectedValueAsObject) – kha

1

Int64Int32のソースコードを見てください。 Int64からの抜粋:

http://www.dotnetframework.org/default.aspx/[email protected]/[email protected]/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/[email protected]/1305376/[email protected]

public override bool Equals(Object obj) { 
     if (!(obj is Int64)) { 
      return false; 
     } 
     return m_value == ((Int64)obj).m_value; 
    } 

あなたが気付いた場合、等号が最初に行うことは、型チェックです。タイプは互換性がなく、Int32Int64にキャストするか、必要なものをカスタムEqualsと書くだけです。

そして実証するいくつかのテスト:

public class Blah 
{ 
    public Int32 Id32 { get; set; } 
    public Int64 Id64 { get; set; } 
} 

private void DoTest() 
{ 
    var blah = new Blah 
    { 
     Id32 = 1, 
     Id64 = 1 
    }; 

    object idInt32 = blah.GetType().GetProperty("Id32").GetValue(blah, null); 
    object idInt64 = blah.GetType().GetProperty("Id64").GetValue(blah, null); 
    object selectedValue = 1; // default type is Int32 

    bool areTheSameInt = idInt32.Equals(selectedValue); // true 
    bool areTheSameLong = idInt64.Equals(selectedValue); // false 
} 
関連する問題