1

私は途方に暮れています。String キーを持つ Dictionary オブジェクトがあります。オブジェクトは、私が持っているカスタム タイプです。この例では、InvalidCastException がスローされます。

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

代わりに「ContainsKey」を使用すると、InvalidCastException が発生します。

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

どちらの場合も、Dict["abc"] を監視すると、必要な値が Dictionary から取得されます。例外の詳細は、追加情報を提供しません。

この状況を再現する小さなコード サンプルをまとめてみましたが、私のコード サンプルは完全に機能します。この問題のコード サンプルを提供する方法がわかりません。

ディクショナリにキーが存在するかどうかを確認するときに InvalidCastException が発生するのはなぜですか? ContainsKey がその実装でキャストを行う必要があるのはなぜですか? これを修正するにはどうすればよいですか?

4

1 に答える 1

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()
于 2012-02-24T17:09:28.133 に答える