2012-02-24 26 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() 
相关问题