应该实现System.IFormattable.Format(...)抛出异常吗?

时间:2017-10-17 06:02:01

标签: c# formatting

我正在使用实现System.IFormattable接口的类创建API。为了帮助弄清楚实现细节,我在mscorlib中对现有的IFormattable结构进行了一些测试。我对执行以下代码的结果感到惊讶:

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类的模式?

1 个答案:

答案 0 :(得分:2)

如果格式字符串无效,您可以从实现中抛出;请参阅IFormattable示例代码中的示例。

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

注意在switch语句的末尾,它是如何抛出默认情况的。

或者,只尝试使用一个字符。 (5).ToString("A")抛出。

请注意IFormattable的其他要求:

  • 您必须支持格式字符串"G",这意味着某种通用表示。
  • 您必须支持null或空格式字符串,并将其视为"G"
  • 您必须支持空IFormatProvider,并在这种情况下使用CultureInfo.CurrentCulture