表达式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
的默认值,因此没有相关性。)
答案 0 :(得分:6)
我完全没有深入了解实际设计团队背后的推理,但在我看来,它可能是某种“默认值等效”。 Null是字符串的默认值,因此将其转换为默认值int似乎是合乎逻辑的。但是String.Empty是一个像任何其他非空字符串数据一样的字符串,所以它应该被格式化,因此是例外。
我认为ArgumentNullException将是一个“更清洁”的决定,但我不知道这一切背后可能存在的任何内部问题......
另一个编辑:
在 MSDN documentation 中,有5种可能的结果之一:
转换成功。对于之前结果中未列出的两种不同基本类型之间的转换,所有扩展转换以及不会导致数据丢失的所有缩小转换都将成功,并且该方法将返回值目标基类型。
似乎从null对象到另一种类型的转换没有理由失败(不是格式错误,不是不受支持的类型转换),但是诸如int之类的值类型没有表示“没有数据“,因此产生了目标类型的默认值。
快速思考 - “对立”转换Convert.ToString(0)
不会产生null,因为: