Dictionaryから継承するカスタムDictionaryクラスを作成しました。ただし、クラスの使用方法によっては、インデクサーを呼び出すときに奇妙なことが起こります。クラスの簡略化されたバージョンは次のとおりです。
public class MyDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
public new TValue this[TKey key]
{
get
{
return base[key];
}
set
{
base[key] = value;
}
}
}
次に、インスタンスを作成して何かを追加します。以下は正常に機能します。つまり、インデクサーのセッターにブレークポイントを設定すると、ヒットします。
MyDictionary<int, string> dict = new MyDictionary<int, string>();
dict[0] = "some value";
ただし、このようにすると(IDictionary変数にインスタンス化されます):
IDictionary<int, string> dict = new MyDictionary<int, string>();
dict[0] = "some value";
インデクサーのセッターのブレークポイントにヒットしなくなります。つまり、他の何かを呼び出している必要があります。.NETのディクショナリ実装(クラスが継承するもの)を見ると、オーバーライドするインデクサー以外のインデクサーは見つかりません。また、他のインデクサーからは継承されません。だから問題は、何が起こっているのかということです。