2012-02-24 59 views
0

我不知所措。我有一個帶有字符串鍵的Dictionary對象。這些對象是我擁有的自定義類型。這個例子引發InvalidCastException:InvalidCastException調用Dictionary.TryGetValue(String,out對象)時。爲什麼?

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

如果我改用 「的containsKey」,我仍然得到一個InvalidCastException:

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

在這兩種情況下,如果我把手錶放在快譯通[ 「ABC」] ,我從字典中獲得了我想要的值。異常詳細信息不提供額外的信息。

我試着放在一起復制這種情況的小代碼示例,但我的代碼示例完美工作。我不知道如何爲這個問題提供代碼示例。

爲什麼在檢查字典中是否存在鍵時會出現InvalidCastException?爲什麼ContainsKey甚至需要在其實現中進行任何投射?我該如何解決?

+2

所以你不能重現它,並且在例外中有* no *信息?像,可能是堆棧跟蹤?目前還不清楚任何人如何能夠提供幫助。 – 2012-02-24 17:02:01

+0

你能發表你的字典的聲明嗎? ContainsKey只會引發ArgumentNullException而不是InvalidCastException,因此它是您之前正在做的或與您的字典的聲明有關的事情。 – Jetti 2012-02-24 17:03:10

+1

你可以添加Dict的聲明嗎? – 2012-02-24 17:04:18

回答

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() 
相關問題