public class GenericHashtable : Hashtable, IEnumerable> { public GenericHashtable() : base() {} public GenericHashtable(int capacity) : base(capacity) {} public virtual void Add(K key, V value) { base.Add(key, value); } [Obsolete("The key must be type of K, value must be type of V!", true)] public new void Add(object key, object value) { //this method can't be used anymore } public V this[K key] { get { return (V)base[key]; } set { base[key] = value; } } [Obsolete("The key must be type of K, value must be type of V!", true)] public new object this[object key] { get { return null; } set { } } public new IEnumerator> GetEnumerator() { IDictionaryEnumerator enumerator = base.GetEnumerator(); while (enumerator.MoveNext()) yield return new KeyValuePair((K)enumerator.Key, (V)enumerator.Value); } public override string ToString() { StringBuilder result = new StringBuilder(); foreach (KeyValuePair elem in this) { result.AppendFormat("[{0}; {1}]\r\n", elem.Key, elem.Value); } return result.ToString(); } }