/// <inheritdoc />
        public void Add(TIndex key, TValue value)
        {
            IDictionaryContracts.Add(this, key);

            // this method's contracts checks that the dictionary doesn't already contain this key
            // thus if it passes the contract a new value will always be added
            this.indexable[key] = TryValue.New(value);
            this.count++;
        }
        /// <inheritdoc />
        public override void Add(TKey key, TValue value)
        {
            IDictionaryContracts.Add(this, key);

            if (this.addValue(KeyValuePair.New(key, value)))
            {
                this.Dictionary.Add(key, value);
            }
        }
        /// <inheritdoc />
        public void Add(TIndex key, TValue value)
        {
            IDictionaryContracts.Add(this, key);

            this.dictionary.Add(key, value);
        }
        /// <inheritdoc />
        public virtual void Add(TKey key, TValue value)
        {
            IDictionaryContracts.Add(this, key);

            this.Dictionary.Add(key, value);
        }