2011-07-21 4 views
1

私はプロジェクトに取り組んでいます。オブジェクトの一般的なリストでshort型の値を調べなければなりません。不思議なことに、私はオブジェクトのジェネリックリストにその値があっても常にfalseを返すことに気付きました。プロジェクトのシナリオを複製する小さなコードを提供しています。オブジェクトの一般的なリストには短い返りfalseが含まれています

List<object> objectList = new List<object>(); 
objectList.Add(1); 
objectList.Add(2); 
objectList.Add(3); 
if (objectList.Contains(1)) 
{ 
    short i = 1; 
    if (objectList.Contains(i)) 
    { 
    } 
    else if (objectList.Contains(i.ToString())) 
    { 
    } 
    else 
    { 
     //Entering this else this loop only 
    } 
} 

私は、これらの型のサイズの違いにより、falseを返す可能性があると想定しています。他の考え。

ありがとうございました。

+0

単純な答えと同じです)、Int16(ショート)を探します – abatishchev

+0

整数のジェネリックリストではないオブジェクトリストを追加しています。また、あなたの説明はelse ifステートメントの最初の見方にも意味があります。文字列とチェックに変換しています – ajay

+0

あなたのリストは 'List 'であり、ボックス化されたInt32を含んでいます。あなたは短いか文字列を探しています。それは両方を含んでいません。それはintだけを含んでいます。 – abatishchev

答えて

1

ボックス化されたIntegerオブジェクトをリストに追加して、ボックス化された短いバージョンまたは文字列バージョンのリストがリストにあるかどうかを確認します。どちらも異なるタイプなのでfalseになります。

最初のテストでshortをintにキャストしてみてください。ジェネリック<int>を使用せず、ボクシング/アンボックをスキップする理由は何ですか?

+0

それは私がやったことです、私はintに変換し、それは真に戻った。整数値は私のコードの列挙体から追加しており、データベースの小さなintであるエンティティのプロパティ値と比較しようとしています。私は古いコードを移動していて、同じコードを追加しました。私はオブジェクトの代わりにジェネリックintを考慮する必要がありますボクシングとunboxingを排除することがあります。ありがとうございました。 – ajay

0

shortはオブジェクトタイプですので、デフォルトでは、それは自分のインスタンスと同じになります。この等式は、次のようなフレームワーク内でオーバーライドされています:

public override bool Equals(object obj) 
{ 
    if (!(obj is short)) 
    return false; 
    else 
    return (int) this == (int) (short) obj; 
} 

ないあなたと私はそれを期待しているだろうか:)

をそれも、より多くの予期しないあなたが思うだろうよりも、です。以下の例を取る:あなたはのInt32を追加します(INT:predicatable

+1

CompareToとEqualsのメソッドシグネチャだけでなく、いくつかの値型の暗黙的な変換のためのC#のルールを勉強すれば、一貫しています。 – hatchet

+0

いいえ:http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx - > x.Equals(y)はy.Equalsと同じ値を返します(バツ)。 – Eddy

+0

ありがとうございます。あなたの観察は本当に役に立ちます。 – ajay

3
objectList.Add(1); 

エン

int i = 1; 
short s = 1; 
System.Console.WriteLine(i==s ? "Yes" : "No"); // Yes 
System.Console.WriteLine(i.CompareTo(s)==0 ? "Yes" : "No"); // Yes 
System.Console.WriteLine(s.CompareTo(i) == 0 ? "Yes" : "No"); // ERROR ! 
System.Console.WriteLine(s.Equals(i) ? "Yes" : "No"); // No 
System.Console.WriteLine(i.Equals(s) ? "Yes" : "No"); // Yes 

ない非常に一貫は

int i = 1; 
objectList.Add(i); 

ので

int y = 1; 
objectList.Contains(y); // true 

short z = 1; 
objectList.Contains(z); // false 
関連する問題