【发布时间】:2013-01-28 06:02:22
【问题描述】:
表达式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) 会引发异常而不是返回0 的Int32 默认值。 (答案是String.Empty不是String的默认值,所以没有相关性。)
【问题讨论】:
-
Null 可以被视为没有数据 - 而空字符串 是 一个字符串,只是一个空字符串......而且这不是一个数字。 (我个人不希望它对 null 如此宽容,但那是另一回事。)
-
+1 有趣的问题。我原以为它会抛出异常,就像传递 "" 一样。 特别是当 Int32.Parse(null) 抛出异常时! (好吧,好吧,这是转换和解析之间的细微差别——但即便如此......)
-
如果你真的想对这类问题大吃一惊,请比较 SQL
NULL与 C#null。 -
有趣的问题。 TBH 我认为这是一个糟糕的设计选择。在我看来,null 和 "" 都不是有效的整数,两者都应该导致异常。
-
按照目前的投票情况,“重复”问题的第二个答案回答了这个问题(“为什么”部分):stackoverflow.com/a/11580256/211627
标签: c# .net type-conversion