String.Empty与Null的Convert.ToInt32(String)

时间:2013-02-12 20:08:56

标签: c# .net type-conversion

表达式Convert.ToInt32(String.Empty)将引发FormatException,因为它无法将空字符串解析为Int32值。

但是,VB.NET中的表达式Convert.ToInt32(DirectCast(Nothing, String))或C#中的Convert.ToInt32((string)null)将解析null到Int32值为零。

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)引发异常而不是返回Int32的默认值{ {1}}。 (答案是0不是String.Empty的默认值,因此没有相关性。)

1 个答案:

答案 0 :(得分:6)

我完全没有深入了解实际设计团队背后的推理,但在我看来,它可能是某种“默认值等效”。 Null是字符串的默认值,因此将其转换为默认值int似乎是合乎逻辑的。但是String.Empty是一个像任何其他非空字符串数据一样的字符串,所以它应该被格式化,因此是例外。

我认为ArgumentNullException将是一个“更清洁”的决定,但我不知道这一切背后可能存在的任何内部问题......

另一个编辑:
MSDN documentation 中,有5种可能的结果之一:

  

转换成功。对于之前结果中未列出的两种不同基本类型之间的转换,所有扩展转换以及不会导致数据丢失的所有缩小转换都将成功,并且该方法将返回值目标基类型。

似乎从null对象到另一种类型的转换没有理由失败(不是格式错误,不是不受支持的类型转换),但是诸如int之类的值类型没有表示“没有数据“,因此产生了目标类型的默认值。

快速思考 - “对立”转换Convert.ToString(0)不会产生null,因为:

  • 0是数据,在许多情况下它可以是非常有效和重要的值
  • null不是0
  • 的正确字符串表示形式