首先注意,全部使用了顯式接口成員實現,也 就是說,只能通過接口調用這些方法。另外它的Item屬性調用了還未實現的 IDictionary<TKey, TValue>接口的Item屬性:
this[(TKey)key] = (TValue)value;
所以需要先把這句屏蔽掉,等最後再釋放出來。另外 調用了兩個新的私有方法,也需要加進去:
private static void VerifyKey(object key)
{ //檢查key類型是否兼容TKey
if (key.Equals(null))
{
throw new ArgumentNullException("key");
}
if (!(key is TKey))
{ //檢查key是否和TKey兼容。注意,此時 TKey已經被替換為實際類型
throw new ArgumentException (
"參數類型錯誤", "key");
}
}
private static void VerifyValueType (object value)
{ //檢查value類型
if (!(value is TValue) && ((value != null) || typeof (TValue).IsValueType))
{
throw new ArgumentException(
"參數類型錯誤", "value");
}
}
VerifyValueType方法進行類型檢查時有一個奇怪的判斷,這一 點主要是針對C#2.0的可空類型而設的。也就是說,在這裡,空的值類型是合法 的。關於可空類型,可以參考:
http://cgbluesky.blog.163.com/blog/static/241235582008111129264 23/
下面,就剩下IDictionary接口成員方法沒有實現了。其中,由於 Clear()方法同時為IDictionary和ICollection <KeyValuePair<TKey, TValue>>的成員方法,但兩者的返回值和參數完全相同,所以可以共用一 個拷貝:
public void Clear()
{
this.version++;
Array.Clear(this.keys, 0, this._size);
Array.Clear(this.values, 0, this._size);
this._size = 0;
}
剩下的全部為顯式接口成員實現:
void IDictionary.Add(object key, object value)
{ //做類型檢查再添加
ReversibleSortedList<TKey, TValue>.VerifyKey(key);
ReversibleSortedList<TKey, TValue>.VerifyValueType(value);
this.Add((TKey)key, (TValue)value);
}
bool IDictionary.Contains(object key)
{
if (ReversibleSortedList<TKey, TValue>.IsCompatibleKey(key))
{
return this.ContainsKey((TKey)key);
}
return false;
}
IDictionaryEnumerator IDictionary.GetEnumerator()
{
return new ReversibleSortedList<TKey, TValue>.Enumerator<TKey, TValue>(
this);
}
void IDictionary.Remove(object key)
{
if (ReversibleSortedList<TKey, TValue>.IsCompatibleKey(key))
{ //這裡調用了IDictionary<TKey, TValue>接口的Remove方法 ,由於
//還沒有實現它,所以先把這句屏敝掉
// this.Remove((TKey)key);
}
}