假设我们有以下场景:一个派生自 Dictionary 的类,并且这个类也有一个字符串索引器的实现,但是索引器返回值的属性不是键(把它想象成一个包含元素的字典)一个 int 或一个 guid 作为键,但也有一个您希望为其创建索引器的字符串属性)。
public class StringDictionary<TKey> :
Dictionary<TKey, object>
{
public object this[string val]
{ get { } set { } }
}
现在,这是 C# 的行为方式(相当直观),具体取决于实例化 StringDictionary 时 TKey 的类型
StringDictionary<string> dict1;
dict1["string"]; // will use the indexer defined in StringDictionary
StringDictionary<int> dict2;
dict2[0]; // will use the indexer defined in Dictionary
dict2["string"]; // will use the indexer defined in StringDictionary
- 如果 TKey 是字符串,则只有在 StringDictionary 中声明的索引器可用
- 如果 TKey 不是字符串,则两个索引器都可用(StringDictionary 中的字符串索引器和 Dictionary 中的 TKey 索引器)
我的问题是:当泛型基类中定义的索引器和派生类中定义的索引器之间存在“冲突”时,C# 如何决定使用哪个索引器,就像上面的示例一样?是否与将 TKey 显式声明为字符串而新索引器只是隐藏继承的索引器相同?
正如我所说,它非常直观,不会引发任何错误或警告,但我想知道它的工作机制,因为在我看来这是一个更复杂的成员隐藏版本。