辞書のようなオブジェクトを作成したかったので、IDictionary<K,V>
インターフェイスを実装するのが正しい方法だと思って、基本の辞書を組み込むために合成を使用してください。私はその後、私は私が必要となるすべてのカバーメソッドをスタブアウトするには、Visual Studioの「インタフェースを実装する」能力を使用し、以下の(K
= string
、= int
V
)なぜC#ディクショナリはすべてIDictionaryを実装していませんか?
public class DictionaryLikeObject : IDictionary<string,int> {
Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();
}
から始まりました。 IDictionary
の
三つの方法がDictionary
に存在していないようです:まだ
void Add(KeyValuePair<string, int> item);
void CopyTo(KeyValuePair<string, int>[] array, int arrayIndex);
bool Remove(KeyValuePair<string, int> item);
the Microsoft documentation明確Dictionary
がIDictionary
を実装していることを示しています。だから私はこれら3つの方法が利用可能であると期待していたでしょう。 、ドキュメントからDictionary<K,V>
[SerializableAttribute]
[ComVisibleAttribute(false)]
public class Dictionary<K, V> : IDictionary<K, V>,
ICollection<KeyValuePair<K, V>>, IEnumerable<KeyValuePair<K, V>>,
IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback
これら3つの不足しているメソッドの定義をコピーするには、私は信じて、ICollection<>
で発見されています。しかしが持っているClear()
のような他の方法もあります。
質問1: C#はどのようにこれらの3つを実装せずに立ち去ることができますか?これはなぜですか?私はこれがコンパイラエラーだと思う(私の推論のため、以下を参照)。 質問2:また、何が欠けていますか?
私はそれがコンパイラエラーかもしれないと考えている理由です。
Dictionary<string, int> dictionary1 = new Dictionary<string, int>();
IDictionary<string, int> dictionary2 = new Dictionary<string, int>();
KeyValuePair<string, int> item = new KeyValuePair<string, int>("test", 1);
//dictionary1.Add(item); // compile error: No overload for method 'Add' takes 1 argument
dictionary2.Add(item); // works like a charm
Debug.WriteLine(@"dictionary2[""test""] = {0}", dictionary2["test"]); // outputs: dictionary2["test"] = 1
方法のvoid Add(KeyValuePair<string, int> item)
は、(それがコンパイルされませんので)Dictionary<string,int>
でないと表示されますが、それはIDictionary<string,int>
であり、そして何とかコンパイラが正しくの実装を見つけるん:次のコードを調べます。 質問3:何が起こっているのですか?
Dictionary<K,V>
のMicrosoftドキュメントでは、これら3つの方法を指定していないことに注意してください。すべての3つの方法が簡単に仕事ができるように
最後には、私の実際の実装では、私が
IDictionary<string,int> _backingDictionary = new Dictionary<string,int>();
代わりの
Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();
を使用して終了しました。
これはまさに私の最初の推測でした。なぜこれがMSDNのドキュメントで指定されていないのか知っていますか?また、なぜそれらの方法を隠してしまったのですか? –
@the_drow、私は彼らがなぜドキュメンテーションでその区別をしないのか分からないし、なぜ彼らが選んだのか100%確信していない。後者のための私の最初の本能は、デフォルトでAddの単一のオーバーロードを提供したかったということです。 – JaredPar
@the_drow:実際にはMSDNのドキュメントで指定されています。 Explicit Interface Implementationにスクロールしてください。 – Daniel