2012-02-24 9 views
0

私は迷っています。私は文字列キーを持つ辞書オブジェクトを持っています。オブジェクトは私が持っているカスタムタイプです。この例では、InvalidCastExceptionがスローされます:Dictionary.TryGetValue(String、outオブジェクト)を呼び出すときにInvalidCastExceptionが発生します。どうして?

MyObject temp; 
if(Dict.TryGetValue("abc", out temp)) //exception 

私が代わりに "にContainsKey" を使用している場合は、私はまだInvalidCastExceptionが取得:

if(Dict.ContainsKey("abc")) //exception 

どちらの場合も、私はDictの上の時計を置く場合は[ "ABC"]私は辞書から必要な価値を得ています。例外の詳細には、追加情報はありません。

この状況を複製する小さなコードサンプルをまとめてみましたが、私のコードサンプルは完全に機能します。私はこの問題のコードサンプルを提供する方法を知らない。

ディクショナリ内のキーの存在をチェックするときにInvalidCastExceptionが発生するのはなぜですか?なぜContainsKeyは実装でキャストを行う必要がありますか?これをどうやって解決するのですか?

+2

これを再現することはできません。例外には*情報はありませんか?おそらく、スタックトレース?誰がどのように手伝うことができるのかは明確ではありません。 –

+0

あなたは辞書の宣言を投稿できますか? ContainsKeyは、InvalidCastExceptionではなくArgumentNullExceptionをスローするだけなので、あなたが辞書の宣言の前に行っていることやそれと関係があるものです。 – Jetti

+1

Dictの宣言を追加できますか? –

答えて

0

まあ、私はでそれを再生する方法を考え出すが、それは間違ってここに何が起こっているのですか否かが言うことは不可能であることができます。このは、関連する情報をに与えないこと

using System; 
using System.Collections.Generic; 

public class Test 
{ 
    static void Main() 
    { 
     var dictionary = new Dictionary<string, string>(new BadComparer()); 
     string temp; 
     dictionary["bad"] = "oops"; // Fine... 
     dictionary.TryGetValue("bad", out temp); // Bang! 
    }  
} 

class BadComparer : IEqualityComparer<string> 
{ 
    public int GetHashCode(string x) 
    { 
     return x.GetHashCode(); 
    } 

    public bool Equals(string x, string y) 
    { 
     // Bang! 
     ((BadComparer) (object) x).ToString(); 
     return x.Equals(y); 
    } 
} 

は注意例外:

Unhandled Exception: System.InvalidCastException: Unable to cast object of type 
'System.String' to type 'BadComparer'. 
    at BadComparer.Equals(String x, String y) 
    at System.Collections.Generic.Dictionary`2.FindEntry(TKey key) 
    at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value) 
    at Test.Main() 
関連する問題