2017-10-17 52 views
0

我正在使用實現System.IFormattable接口的類創建API。爲了幫助理清實現細節,我對mscorlib中的現有IFormattable結構進行了一些測試。我很驚訝,通過執行以下代碼的結果:System.IFormattable.Format(...)的實現應該引發異常嗎?

string s1 = int.MaxValue.ToString("ABC", CultureInfo.CurrentCulture); 
string s2 = DateTime.Now.ToString("ABC", CultureInfo.CurrentCulture); 

而不是拋出異常的無法識別的格式字符串,無論是方法調用只是返回的字符串"ABC"

當我嘗試:

string s3 = int.MinValue.ToString("ABC", CultureInfo.CurrentCulture); 

返回"-ABC"

,這是什麼意外的行爲的原因,是它應遵循所有IFormattable類模式(?!?!)?

+0

顯然,沒有預定義格式說明符的字符會作爲文字字符複製到「ToString」的輸出中。如果沒有格式說明符和佔位符(如{0}),則只會顯示文字字符,不會顯示數字。然而,不確定爲什麼總是在輸出中出現負數的減號,而與剩餘的格式字符串無關。也不知道爲什麼像'.ToString(「A」)''這樣的單個文字會導致異常。 –

+1

對於某些類型,格式字符串是字面文本和佔位符的混合,原則上這是一個有用的功能。但我不是「每個未知字符都是字面上的」規則的粉絲,因爲它會阻止未來添加新的佔位符。 – CodesInChaos

回答

2

如果格式字符串無效,您可以從您的實施中拋出;請參閱IFormattable示例代碼中的示例。在switch語句的結束,它是如何罰全中,默認情況下

https://msdn.microsoft.com/en-us/library/system.iformattable(v=vs.110).aspx#Anchor_3

注意。

或者,也可以嘗試只使用一個字符。 (5).ToString("A")投擲。

IFormattable雖然其他要求:

  • 您必須支持的格式字符串"G",這意味着某種普遍的代表性。
  • 您必須支持空格式或空格式字符串,並將其與"G"相同對待。
  • 在這種情況下,您必須支持空IFormatProvider,並使用CultureInfo.CurrentCulture