2017-10-17 22 views
0

私はSystem.IFormattableインターフェイスを実装するクラスを持つAPIを作成しています。実装の詳細を理解するために、mscorlibの既存のIFormattable構造体についていくつかのテストを行いました。両方の方法は、単に文字列"ABC"を返さ呼び出し、代わりに、認識できない形式の文字列の例外をスローのSystem.IFormattable.Format(...)の実装は例外をスローする必要がありますか?

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

:私は次のコードを実行した結果に驚きました。

私は試してみてください。

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

それは"-ABC"を返し

をこの予期しない動作の原因であり、それはすべてのIFormattableのクラスのために従わなければならないパターンである何(?!?!)?

+0

明らかに、定義済みの書式指定子でない文字は、文字列として 'ToString'の出力にコピーされます。フォーマット指定子も{0}のようなプレースホルダーもない場合は、数字のないリテラル文字だけが表示されます。しかし、残りの書式文字列とは無関係に、負の数のマイナス記号が常に出力に表示される理由はわかりません。 '.ToString(" A ")'のような単一のリテラルがなぜ例外につながるのかもわかりません。 –

+1

一部のタイプでは、フォーマット文字列はリテラルテキストとプレースホルダを組み合わせたもので、原則的には便利な機能です。しかし、私は将来、新しいプレースホルダーを追加することができないため、「すべての未知の文字は文字通りです」ルールのファンではありません。 – CodesInChaos

答えて

2

フォーマット文字列が無効である場合、実装からスローすることはできますが、 IFormattableサンプルコードの例を参照してください。

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

それがデフォルトの場合にスローされますどのようにswitch文の末尾に注意。

または、1文字で試してみてください。 (5).ToString("A")がスローします。しかし

IFormattableの他の要件を:

  • あなたは一般的な表現のいくつかの種類を意味フォーマット文字列"G"を、サポートしている必要があります。
  • nullまたは空の書式文字列をサポートし、それを"G"と同じに扱う必要があります。
  • nullの場合はIFormatProviderをサポートし、その場合はCultureInfo.CurrentCultureを使用する必要があります。
関連する問題