2012-02-24 4 views
0

나는 분실했습니다. 문자열 키가있는 Dictionary 개체가 있습니다. 개체는 내가 가진 사용자 지정 형식입니다. [ "ABC"를] 내가 DICT에 시계를 넣어 경우, 두 경우 모두Dictionary.TryGetValue (String, out object)를 호출 할 때 InvalidCastException이 발생합니다. 왜?

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

: 내가 대신 "ContainsKey"를 사용하는 경우, 나는 여전히 InvalidCastException이 얻을

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

:이 예에서는 InvalidCastException이를 던졌습니다 , 나는 사전에서 원하는 가치를 얻는다. 예외 세부 정보는 추가 정보를 제공하지 않습니다.

이 상황을 복제하는 작은 코드 샘플을 모으려고했지만 코드 샘플이 완벽하게 작동합니다. 이 문제에 대한 코드 샘플을 제공하는 방법을 모르겠습니다.

사전에서 키의 존재 여부를 확인할 때 InvalidCastException이 발생하는 이유는 무엇입니까? 왜 ContainsKey는 구현시 캐스팅을 수행해야합니까? 이 문제를 어떻게 해결할 수 있습니까?

+2

따라서 재생산 할 수 없으며 예외에는 * 정보가 없습니다. 아마도, 스택 추적은? 누군가가 도울 수있는 방법이 명확하지 않습니다. –

+0

사전의 선언을 게시 할 수 있습니까? ContainsKey는 InvalidCastException이 아닌 ArgumentNullException만을 throw하므로 이전에 수행 중이거나 사전 선언과 관련이있는 작업입니다. – 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()