23

この式Convert.ToInt32(String.Empty)は、空の文字列を Int32 値に解析できないため、FormatException を発生させます。

ただし、Convert.ToInt32(DirectCast(Nothing, String))VB.NET またはConvert.ToInt32((string)null)C# の式は、null をゼロの Int32 値に解析します。

の .NET ソースを掘り下げるとConvert.cs、次のコードが表示されます。

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);
}

(両方とも .NET 2.0 にさかのぼることに注意してください。おそらくそれ以前ですString.IsNullOrEmpty()。)Convert.ToInt32()

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

4

1 に答える 1

10

この背後にある実際の設計チームの推論についてはまったく洞察がありませんが、ある種の「デフォルト値の同等性」のように思えます。Null は string のデフォルト値なので、デフォルト値の int に変換するのが理にかなっているようです。ただし、String.Empty は、他の null 以外の文字列データと同様の文字列であるため、フォーマットされることが期待されるため、例外が発生します。

ArgumentNullException は「よりクリーンな」決定だったと思いますが、このすべての背後にある内部の問題が何であるかはわかりません...

別の編集: MSDN のドキュメントに、5 つの考えられる結果の 1 つがあります

成功した変換。前の結果にリストされていない 2 つの異なる基本型の間の変換の場合、すべての拡大変換と、データの損失に至らないすべての縮小変換は成功し、メソッドはターゲットの基本型の値を返します。

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

簡単に考えてみると、次の理由により、「反対の」変換 はConvert.ToString(0)null を生成しません。

  • 0 はデータです。多くの場合、非常に有効で重要な値になります。
  • null は 0 の正しい文字列表現ではありません
于 2013-02-12T20:12:57.960 に答える