我只是今天这个碰上了,如果你将null转换为INT32
Convert.ToInt32(null)
它返回0
我期待一个InvalidCastException ...
任何想法,为什么出现这种情况?
我只是今天这个碰上了,如果你将null转换为INT32
Convert.ToInt32(null)
它返回0
我期待一个InvalidCastException ...
任何想法,为什么出现这种情况?
任何想法,为什么出现这种情况?
因为这是记录的行为? 无论是Convert.ToInt32(object)
或Convert.ToInt32(string)
,文档指出很清楚:
(主管返回值)
一个32位有符号整数,它等效于数中值,或0(零),如果值为空。
要么
一个32位带符号整数等于值,或者零,如果值为空。
与往常一样,如果现实不匹配的期望,你应该做的第一件事就是检查你的期望是否符合记录的行为。
我个人不完全买加文所示的说法“与VB6的兼容性”。 我知道它来自微软,它可能是真正的原因,它的行为这样-但我不认为这是一个很好的理由,行为的方式。 有大量的VB-具体转换方法 - 因此,如果框架的设计者确实认为回零是一个不理想的结果,他们应该做任何他们认为最好的,和VB6的程序员提供了一种用VB6兼容的转换。
显然,一旦行为是在.NET 1.0中定义,它是不能改变的更高版本 - 但是这并不等于说它必须的行为方式VB6相同。
见http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx
编辑
上述网址自动恢复到最新的Framework版本,其中如下面的文本上4版是专门贴看到修改后的URL,低于该显示文本。
http://msdn.microsoft.com/en-us/library/sf1aw27b(v=vs.100).aspx
它说明:
所有的Convert类的字符串到数字的转换方法返回零如果字符串为空。 原动机这种行为是,他们会提供一套转换方法为程序员迁移从Visual Basic 6到镜像现有Visual Basic 6的转换方法的行为的Visual Basic .NET。 他们认为,C#程序员会更舒服铸造运营商,而Visual Basic中不得不进行类型转换传统使用的转换方法。
传统上,在.NET Framework试图维持因版本的高度兼容性。 实际上,这意味着,在没有非常令人信服的理由,一旦一种方法,一种特定的方式被实现,并且实现公开曝光(如返回0,如果字符串参数为空的方法),它不能被改变,因为这将打破依赖于建立行为的代码。 这使得无论你提出的解决方案非常problemmatic。 在第一种情况下,抛出一个异常改变的方法的谁都有可能依赖于一个空字符串返回零的方法客户实现。 在第二种情况下,一定要记住的是,.NET Framework不考虑在重载返回类型是非常重要的。 这意味着,你的方法将不得不替换现有Convert.ToInt32(字符串值)方法,并且不希望处理可空类型的所有代码现在将被打破。
此关心兼容性是即使在在Convert类的字符串到数字转换方法的情况下更强,因为解析是针对每个由.NET支持的原始数字类型的执行字符串到数字转换的推荐方法框架,每个Parse方法的行为有所不同,其相应的转换方法。 不像在转换类,它返回零,如果要转换的字符串为空字符串到数字的转换方法,每个解析方法抛出一个ArgumentNullException,这是你主张的行为。 的数值解析方法,如Int32.Parse和Double.Parse的过载,也可以选择允许在解析操作更精密的控制的优点。
因为一个Int32的默认值是零。 因为它们是值类型,而不是引用类型,所以你得到的默认值,而不是INT32的不能为空。
因为那是什么文件 ,它会返回。 也许你在想的(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;
如果你执行它的异常应该提高。
指某东西的用途
Convert.ToInt32(var)
当你在不信任值,从数据库中读取时,随着非常有用。