次のシナリオがあるとします: Dictionary から派生したクラスで、このクラスにも文字列インデクサーの実装がありますが、インデクサーが値を返すプロパティはキーではありません (要素の辞書のように考えてください。キーとしての int または guid だけでなく、インデクサーを作成したい文字列プロパティもあります)。
public class StringDictionary<TKey> :
Dictionary<TKey, object>
{
public object this[string val]
{ get { } set { } }
}
次に、StringDictionary をインスタンス化するときの TKey の型に応じて、C# がどのように動作するか (かなり直感的です) を次に示します。
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 が文字列として明示的に宣言され、新しいインデクサーが継承されたものを単に非表示にするのと同じですか?
私が言ったように、それは非常に直感的で、エラーや警告をスローしませんが、これが機能するメカニズムを知りたいです.