【问题标题】:Convert.ToInt32(String) on String.Empty vs. Null [duplicate]String.Empty 与 Null 上的 Convert.ToInt32(String) [重复]
【发布时间】: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


【解决方案1】:

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

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

另一个编辑:
在那里,就在 MSDN documentation 中,5 种可能的结果之一:

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

似乎从空对象到另一种类型的转换没有理由失败(不是格式错误,不是不支持的type转换),但是像int这样的值类型没有“没有数据”,因此会产生目标类型的默认值。

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

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

【讨论】:

  • 我会接受这个,因为它会刺激我的好奇心。 @Cyborgx37 在对原始问题的评论中发布的stackoverflow.com/questions/11580208/… 中的“VB6 Legacy Support”答案对我来说似乎也是一个正当理由。
  • 非常有趣。也与今天的 XKCD 条有关 :) xkcd.com/1172
  • 我认为这个理由不成立,因为根据 MSDN 链接,应该抛出 FormatException,因为“要转换为任何数字类型的字符串不被识别为有效数字。”。跨度>
  • @HonzaBrestan 不确定您将如何解释 int.Parse(null) 给出异常。奇怪的选择,但我的推理就像“因为文档是这样说的”。
猜你喜欢
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 2013-08-23
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多