为什么Convert.ToInt32(null)在c#中返回0

如果你将null转换为int32,我今天就遇到过这个问题

Convert.ToInt32(null) 

它返回0

我期待InvalidCastException …

知道为什么会这样吗?

知道为什么会这样吗?

因为这是记录在案的行为? 无论是Convert.ToInt32(object)还是Convert.ToInt32(string) ,文档都清楚地说明:

(在返回值下)

一个32位有符号整数,等于值中的数字,如果value为null,则为0(零)。

要么

等于值的32位有符号整数,如果value为null,则为零。

与往常一样,如果现实与预期不符,您应该做的第一件事就是检查您的期望是否与记录的行为相符。

就个人而言,我并没有完全购买Gavin所显示的“兼容VB6”的论点。 我意识到它来自微软,它可能是它的行为方式的真正原因 – 但我认为这不是一个很好的理由。 有很多特定于VB的转换方法 – 所以如果框架设计者真的认为返回零是一个非理想的结果,他们应该做他们认为最好的事情,并提供VB6兼容的转换供VB6程序员使用。

显然,一旦在.NET 1.0中定义了行为,就无法对以后的版本进行更改 – 但这与说它必须以与VB6相同的方式行为并不相同。

请参阅http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx

编辑

上面的URL会自动恢复为最新的Framework版本,其中下面的文本专门发布在版本4上。请参阅下面显示文本的修订URL。

http://msdn.microsoft.com/en-us/library/sf1aw27b(v=vs.100).aspx

它解释说:

如果字符串为null,则Convert类中的所有字符串到数字转换方法都返回零。 这种行为的最初动机是它们将为从Visual Basic 6迁移到Visual Basic .NET的程序员提供一组转换方法,这些方法镜像了现有Visual Basic 6转换方法的行为。 假设C#程序员更适合使用转换操作符,而Visual Basic传统上使用转换方法进行类型转换。

传统上,.NET Framework一直试图保持从版本到版本的高度兼容性。 实际上,这意味着,如果没有极其令人信服的理由,一旦方法以特定方式实现并且实现被公开暴露(如在字符串参数为null的情况下返回0的方法),则无法更改,因为会破坏取决于既定行为的代码。 这使得您提出的两种解决方案都非常有问题。 在第一种情况下,抛出exception会为可能依赖于为null字符串返回零的方法的客户更改方法的实现。 在第二种情况下,重要的是要记住.NET Framework不考虑重载决策中的返回类型。 这意味着您的方法必须替换现有的Convert.ToInt32(String value)方法,并且所有不期望处理可空类型的代码现在都将被破坏。

对于Convert类中的字符串到数字转换方法,这种对兼容性的关注甚至更强,因为Parse是为.NET支持的每种原始数字类型执行字符串到数字转换的推荐方法。框架和每个Parse方法的行为与其对应的Convert方法不同。 与Convert类中的字符串到数字转换方法不同,如果要转换的字符串为null,则返回零,每个Parse方法抛出一个ArgumentNullException,这是您正在争论的行为。 数值Parse方法的重载,例如Int32.Parse和Double.Parse,也具有允许对解析操作进行更细粒度控制的优点。

因为Int32的默认值为零。 Int32不能为null,因为它们是值类型,而不是引用类型,因此您将获得默认值。

因为这是记录它将返回的内容。 也许你在考虑(int)null ,这将是一个NullReferenceException (不是InvalidCastException ;我不知道为什么)。

因为这是在Convert类中编写方法的方式。 如果参数值为null ,则只返回0。

 public static int ToInt32(object value) { if (value == null) { return 0; } else { return ((IConvertible)value).ToInt32(null); } } 

要获得InvalidCastException,您必须进行非受控转换

例如:

 int i = (int)null; 

如果执行它,则应引发exception。

指某东西的用途

 Convert.ToInt32(var) 

当你不相信var中的值时很有用,就像从数据库中读取时一样。