调用Dictionary.TryGetValue(String,out object)时出现InvalidCastException。为什么?

时间:2012-02-24 16:59:41

标签: c# c#-4.0 dictionary .net containskey

我很茫然。我有一个带有String键的Dictionary对象。对象属于我自定义类型。此示例抛出InvalidCastException:

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

如果我改为使用“ContainsKey”,我仍然会收到InvalidCastException:

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

在这两种情况下,如果我把手表放在Dict [“abc”]上,我会从字典中得到我想要的值。 “异常”详细信息不提供额外信息。

我尝试组合一个复制这种情况的小代码示例,但我的代码示例完美运行。我不知道如何为这个问题提供代码示例。

为什么在检查Dictionary中是否存在键时会出现InvalidCastException?为什么ContainsKey甚至需要在其实现中进行任何转换?我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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()