private static bool IsCompatibleKey(object key)
{
if (key == null) throw new ArgumentNullException(nameof(key));
return key is TKey;
}
private static void VerifyKey(object key) { /* 同 IsCompatibleKey 但失敗拋 ArgumentException */ }
private static void VerifyValueType(object value)
{
if (!(value is TValue) && (value != null || typeof(TValue).IsValueType))
throw new ArgumentException("參數類型錯誤", nameof(value));
// 允許 nullable value type 為 null
}
非泛型版本需處理 Array 可能為 KeyValuePair[] 或 object[]:
void ICollection.CopyTo(Array array, int arrayIndex)
{
// 參數驗證:非 null、一維、下界 0、容量足夠
var pairArray = array as KeyValuePair<TKey, TValue>[];
if (pairArray != null) { /* 複製 KeyValuePair */ }
else
{
var objArray = array as object[];
if (objArray == null) throw new ArgumentException("錯誤的陣列類型");
try { /* 裝箱複製 */ } catch (ArrayTypeMismatchException) { throw new ArgumentException("錯誤的陣列類型"); }
}
}
Item 索引器:get 呼叫 IndexOfKey,set 驗證後轉呼泛型索引器(待實作)。Keys/Values:回傳 GetKeyListHelper()/GetValueListHelper()。Add、Contains、Remove:驗證類型後轉呼泛型對應方法。GetEnumerator:回傳 Enumerator<TKey,TValue> 實例,使 foreach (DictionaryEntry de in dict) 可用。
public void Clear() { version++; Array.Clear(keys, 0, _size); Array.Clear(values, 0, _size); _size = 0; }
測試 foreach (DictionaryEntry d in (IDictionary)rs) 輸出正確,但需轉型呼叫。下節實作泛型 IDictionary<TKey,TValue>。