C# Can';扩展SortedList时,请不要使用某些方法

C# Can';扩展SortedList时,请不要使用某些方法,c#,.net,collections,C#,.net,Collections,我有一个扩展SortedList的类。我可以在我的类中使用许多SortedList方法,比如Add()和Remove(),但由于某些原因,当我尝试使用GetKey()时,它不喜欢它。有人能告诉我为什么会发生这种情况吗 public class SymbolTableImplementation : SortedList<string, SymbolTableEntry>, SymbolTable { public SymbolTableEntry Enter(string n

我有一个扩展SortedList的类。我可以在我的类中使用许多SortedList方法,比如Add()和Remove(),但由于某些原因,当我尝试使用GetKey()时,它不喜欢它。有人能告诉我为什么会发生这种情况吗

public class SymbolTableImplementation : SortedList<string, SymbolTableEntry>, SymbolTable
{
    public SymbolTableEntry Enter(string name)
    {
        SymbolTableEntry entry = SymbolTableFactory.CreateSymbolTableEntry(name, this);
        Add(name, entry);  // This is OK
        return entry;
    }

    //  Look up an existing symbol table entry. Null if it does not exist.
    public SymbolTableEntry Lookup(string name)
    {
        return GetKey(name);  // Doesn't exist in current context
    }
}
公共类SymbolTable实现:SortedList,SymbolTable
{
公共SymbolTableEntry输入(字符串名称)
{
SymbolTableEntry=SymbolTableFactory.CreateSymbolTableEntry(名称,this);
添加(名称、条目);//这是可以的
返回条目;
}
//查找现有符号表项。如果不存在,则为Null。
公共SymbolTableEntry查找(字符串名称)
{
return GetKey(name);//当前上下文中不存在
}
}

SortedList
类中没有名为
GetKey
的方法。

GetKey
SortedList
中定义,它实际上是与
SortedList
完全分离的类。您的原始代码中也有错误;如果您实际使用的是
GetKey
/
SortedList
,则不会编译:

return GetKey(name);
相反,只需使用
IDictionary
索引器:

return this[name];
没有GetKey(),这已经很清楚了。适当的实施是:

public SymbolTableEntry Lookup(string name)
{
    return this[name];
}
这会让你停下来,这个方法是多余的。SortedList的索引器已经足够好,可以完成这项工作。所以只要删除这个方法,这个类的用户就无法猜出使用哪个方法了

请注意,Add()与Enter()存在类似的问题。当客户端程序员使用Add()时,将不会发生任何好事。您真正想做的是替换或隐藏Add()方法,但这是不可能的。你可以让它超负荷工作,但这已经够了


NET集合类并不是真正设计用来派生的,它们的方法不是虚拟的。如果您封装它们,创建自己的集合类,只继承(比如)IDictionary,并使用私有的SortedList来完成工作,它们的工作会更好。这是一个相当大的工作量,但会非常干净。

嗯,积垢。我完全没有注意到有两种不同类型的分类列表。这解释了为什么它不起作用。好的,
返回键[name]不起作用。它说“不能从字符串转换为int.”好的,现在它说的是:不能将类型“string”隐式转换为“explorer.intermediate.SymbolTableEntry”。哎呀,我没有意识到
SortedList
是一个字典,因此从键获取值只需要普通的字典索引器访问。请看我最新的答案。是的,这就是我需要的。但是,我还需要它返回
null
,而不是在密钥不存在时抛出异常,因此我最终执行了以下操作:
return(ContainsKey(name)?this[name]:null)-1因为你说“不喜欢这个”时没有告诉我们你的意思是什么是的,我没意识到这是一本字典。接得好!