我今天刚刚发现了这个问题,如果将null转换为int32
Convert.ToInt32(null)
它返回了0。
我原本期望会出现InvalidCastException异常...
有任何想法为什么会这样发生吗?
我今天刚刚发现了这个问题,如果将null转换为int32
Convert.ToInt32(null)
它返回了0。
我原本期望会出现InvalidCastException异常...
有任何想法为什么会这样发生吗?
你知道为什么会发生这种情况吗?
因为这是文件记录的行为?无论是 Convert.ToInt32(object)
还是 Convert.ToInt32(string)
, 文件都非常明确地说明:
(在返回值下面)
一个32位有符号整数,等同于 value 中的数字;如果 value 为 null,则为 0 (零)。
或者
等同于 value 的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
它解释了:
Convert类中的所有字符串转数字的方法如果字符串为空,则返回零。最初的动机是为了为从Visual Basic 6迁移到Visual Basic .NET的程序员提供一组与现有的Visual Basic 6转换方法相匹配的转换方法。假设C#程序员更喜欢强制转换运算符,而Visual Basic传统上使用转换方法进行类型转换。Convert.ToInt32(object)
? 它仅谈论了值为 null
,这意味着它可能是两个重载函数之一。 - Jon SkeetConvert.ToInt32(null)
并按 F12 键,它会带你到字符串重载,而 Convert.ToInt32((object)null)
则会带你到对象重载。个人认为编译器应该会对此抱怨,但我没有记住解决步骤。 - Adam Houldsworthnull
到string
和null
到object
之间存在转换(所以两者都是候选方法),以及从string
到object
的转换,但没有从object
到string
的转换(所以转换为string
是一种“更好”的转换)。顺便说一下,这是重载,而不是覆盖。 - Jon Skeetnull
时,它会选择最派生的重载?话说,我刚试了一下我的方法,它选择了非“object”路线,我没有意识到它处理对象就是这样的——我之前预期的是模棱两可的调用错误(当指定另一个引用类型的重载时我会得到这个错误)。 - Adam Houldsworth因为 Int32 的默认值是零。Int32 是值类型而非引用类型,因此无法为 null,你会得到默认值。
int.MinValue
等值。 - Jon Skeet因为这是文档记录的返回结果。也许你在想(int)null,它会抛出NullReferenceException异常(不是InvalidCastException异常,我不确定为什么)。
(int)null
给我返回了 *"error CS0037: Cannot convert null to 'int' because it is a non-nullable value type"*。(int)(string)null
也无法编译,结果是 *"error CS0030: Cannot convert type 'string' to 'int'"*。另一方面,int.Parse(null)
抛出 ArgumentNullException,这是合适的。 - Marc.2377因为这是在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)
当你不信任 var 中的值时,比如读取数据库时,这个方法就会很有用。
int i = (int)null
,就会在编译时出现错误。它曾经能够工作吗? - Marc.2377