2013-08-22 43 views
6

我實現一個IDictionary接口,它有參數objectgetset除了使用在C#類型不匹配

object this [object key] { get; set; } 

我想執行的關鍵是字符串類型,所以在我的代碼我做的:

(if key.GetType() != typeof(string)) { 
    // 
} 

我想扔如果發生了異常。但是我不知道在這種情況下使用什麼最合適的例外。最近一個我能找到的是TypeInitializationExceptionArgumentException的。但是,在此document中聲明:「如果將錯誤參數傳遞給成員,請拋出System.ArgumentException或其某個子類型」,這讓我懷疑我的正確用例。

我應該用我的情況?我應該使用斷言而不是拋出異常嗎?

+0

如果您願意,也可以實現自己的異常。 – tnw

+4

如果您將它傳遞給null,您的代碼將通過空指針異常。如果你使用'!(鍵是字符串)',你會得到你在'if'中拋出的任何異常。 – Gabe

+2

爲什麼不強制該鍵是類型參數中的字符串?例如IDictionary

回答

5

ArgumentException是正確的例外。整個BCL使用它,所以你應該。 TypeInitializationException根本不適合。它只有一個用例:一個靜態ctor。這就是說,如果你不生產圖書館(只是內部代碼),如果有充分的理由,你可以偏離該公約。如果您想使用Debug.Assert或其他替代方法,請隨時進行。

+0

我認爲馬修的評論是我正在做的最好的方法。然而,這個答案是我的問題標題的最佳匹配,我會將此標記爲答案,以便人們通過搜索來到這裏更容易。 – bizi

3

首先,我認爲,最好的解決辦法是Mathhew的;爲什麼你只是不使用字符串類型的通用字典。

如果你需要辦理其他方法比代碼契約是做到這一點的最好辦法。

實施例: Contract.Requires(關鍵是字符串); 等 斷言不適合這個問題,但可以應用ArgumentException。

謝謝