我很茫然。我有一个带有String键的Dictionary对象。对象属于我自定义类型。此示例抛出InvalidCastException:
MyObject temp;
if(Dict.TryGetValue("abc", out temp)) //exception
如果我改为使用“ContainsKey”,我仍然会收到InvalidCastException:
if(Dict.ContainsKey("abc")) //exception
在这两种情况下,如果我把手表放在Dict [“abc”]上,我会从字典中得到我想要的值。 “异常”详细信息不提供额外信息。
我尝试组合一个复制这种情况的小代码示例,但我的代码示例完美运行。我不知道如何为这个问题提供代码示例。
为什么在检查Dictionary中是否存在键时会出现InvalidCastException?为什么ContainsKey甚至需要在其实现中进行任何转换?我该如何解决这个问题?
答案 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()