InvalidCastException при вызове Dictionary.TryGetValue (String, out object). Зачем? - PullRequest
1 голос
/ 24 февраля 2012

Я в растерянности.У меня есть объект Dictionary с ключами String.Объекты имеют пользовательский тип, который у меня есть.В этом примере генерируется исключение InvalidCastException:

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

Если я вместо этого использую «ContainsKey», я все равно получаю исключение InvalidCastException:

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

В обоих случаях, если я помещаю часы в Dict [«abc»], я получаю желаемое значение из словаря.Сведения об исключении не предоставляют никакой дополнительной информации.

Я попытался собрать небольшой пример кода, который повторяет эту ситуацию, но мои примеры кода работают отлично.Я не знаю, как предоставить пример кода для этой проблемы.

Почему я должен получить InvalidCastException при проверке на наличие ключа в словаре?Зачем ContainsKey вообще нужно выполнять кастинг в своей реализации?Как мне это исправить?

1 Ответ

0 голосов
/ 24 февраля 2012

Что ж, я могу придумать способ его воспроизведения, но невозможно ли сказать, что здесь происходит что-то не так:

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()
...