2013-02-12 7 views
20

Convert.ToInt32(String.Empty)は、空の文字列を解析してInt32値に変換できないため、FormatExceptionを発生させます。Convert.ToInt32(String)on String.Empty対NULL

ただし、VB.NETの式Convert.ToInt32(DirectCast(Nothing, String))またはC#のConvert.ToInt32((string)null)という式は、nullをInt32値0に解析します。 Convert.csでの.NETソースに掘り

が、私は次のコードを参照してください。

public static int ToInt32(String value) { 
    if (value == null) 
     return 0; 
    return Int32.Parse(value, CultureInfo.CurrentCulture); 
} 

をこれは振る舞いを説明したが、私はそれが代わりにゼロを返すので、このように書かれていた理由を理解したいと思います空の文字列の場合も同様ですか?それはのように書かれなかった理由例えば

、:

public static int ToInt32(String value) { 
    if (String.IsNullOrEmpty(value)) 
     return 0; 
    return Int32.Parse(value, CultureInfo.CurrentCulture); 
} 

(そのString.IsNullOrEmpty()Convert.ToInt32()バックおそらくそれ以前の.NET 2.0、両方の日付に注意してください。)

編集:私の質問this questionと非常によく似ていますが、Convert.ToInt32(String.Empty)0というInt32のデフォルト値を返す代わりに例外を発生させる理由も知りたいと思います。 (答えはString.Emptyで、デフォルト値はStringではないため、相関関係はありません)

+6

空の文字列*は文字列であり空の文字列は空の文字列であるのに対して、それは数字ではありません。 (個人的には、それほど寛大でなくてもいいと思っていますが、それは別の問題です。) –

+0

+1興味深い質問です。私は例外をスローすることを期待していました。 *特にInt32.Parse(null)が例外をスローしたとき! (Ok、それは変換と解析の微妙な違いですが、それでも...) –

+0

このタイプの質問であなたの心を吹き飛ばしたいのであれば、SQLのNULLとC#の 'null'を比較し契約してください。 –

答えて

6

実際の設計チームの推論については、私は全く洞察していませんが、 "デフォルト値同値"。 Nullはstringのデフォルト値です。したがって、それをintのデフォルト値に変換するのは論理的です。 String.Emptyは他のnull以外の文字列データと同様の文字列なので、書式設定されていることが想定されているため例外です。

私は例外ArgumentNullExceptionが「クリーン」決断だっただろうと思うが、私はこのすべて...

別編集の後ろかもしれ内部どんな問題か分からない:右MSDN documentationで、そこ
可能な5つの結果のうちの1つ:

変換が成功しました。前の結果に記載されていない2つの異なる基本タイプ間の変換では、すべての拡大変換とデータの損失をもたらさないすべての縮小変換が成功し、が成功し、メソッドはターゲット基本タイプの値を返します。

別のタイプのヌルオブジェクトからの変換が失敗する理由(ないフォーマットエラーではなく、サポートされていないタイプ変換)を有していないようだが、intなど値型がデータなし」のない表現を持っていません"のため、ターゲットタイプのデフォルト値が生成されます。データである

  • nullではないが、それは多くの場合、非常に有効かつ重要な値にすることができ、: -

    迅速な思考ヌルので、「反対」の変換、Convert.ToString(0)は、得られません正しい文字列表現0

+0

私は好奇心のかゆみを傷つけるので、これを受け入れます。 @ Cyborgx37が元の質問にコメントで投稿した "VB6 Legacy Support"の回答はhttp://stackoverflow.com/questions/11580208/why-convert-toint32null-returns-0-in-c-sharp/11580256#11580256にあります私にとっても正当な理由であるようです。 – MCattle

+3

非常に興味深い。今日のXKCDストリップにも関連しています:) http://xkcd.com/1172/ –

+0

MSDNのリンクによれば、 "すべての数値型に変換される文字列は有効な番号として認識されませんでした。 " – Jonathan

関連する問題