23

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

但是,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);
}

(请注意,String.IsNullOrEmpty()两者Convert.ToInt32()都可以追溯到 .NET 2.0,可能更早。)

编辑:我的问题与这个问题非常相似,但我也想知道为什么Convert.ToInt32(String.Empty)会引发异常而不是返回 Int32 默认值0。(答案String.Empty不是 的默认值String,因此没有相关性。)

4

1 回答 1

10

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

我认为 ArgumentNullException 本来是一个“更干净”的决定,但我不知道这一切背后可能存在什么内部问题......

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

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

看起来从 null 对象到另一种类型的转换没有理由失败(不是格式错误,不是不支持的类型转换),但是像 int 这样的值类型没有“无数据”的表示,所以默认值生成目标类型。

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

  • 0 是数据,在很多情况下它可以是非常有效和重要的值
  • null 不是 0 的正确字符串表示形式
于 2013-02-12T20:12:57.960 回答