5

我制作了一个继承自 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 的 Dictionary 实现(我的类从它继承),除了我覆盖的那个之外,我找不到其他索引器,而且它不会从其他任何东西继承。所以问题是,发生了什么?

4

1 回答 1

12

关键在于索引器声明中的new关键字。这不会覆盖基类索引器,并且每次您从基类或接口访问索引器(如IDictionary您的示例中)时 - 都会调用基类的索引器。此外,您不能覆盖基类索引器,因为它没有virtualDictionary<TKey, TValue>类定义中标记为

考虑这篇关于方法声明中的新修饰符的文章

尝试在这里使用组合,而不是继承。

如果您确定,您需要完全IDictionary<TKey, TValue而不是更抽象的接口的自定义行为,例如ICollection<KeyValuePair<TKey, TValue>>or even IEnumerable<KeyValuePair<TKey, TValue>>,请使用下一个示例:

public class MyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
    IDictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>();

    //LOTS of other methods here, that are required by IDictionary<TKey, TValue>
    //their implementation would be delegation to dictionary instance

    public TValue this[TKey key] //implementation of a interface
    {
        get
        {
            return dictionary[key];
        }
        set
        {
            dictionary[key] = value;
        }
    }
}
于 2013-03-22T13:30:43.550 回答