为什么要使用Convert.ToInt32而不是强制转换?

19

今天在工作中遇到了一个问题,需要将一个对象转换为其特定类型(例如int),我说可以使用强制转换:

int i = (int)object;

我的同事建议我使用Convert.ToInt32()

int i = Convert.ToInt32(object)

Convert.ToInt32()和直接对象转换之间有什么区别?

8个回答

17

并非所有对象都可以直接转换为 int。例如,以下代码将无法编译:

string s = "1";
int i = (int)s;
因为 string 不能隐式转换为 int

然而,这是合法的:
string s = "1";
int i = Convert.ToInt32(s);

顺带一提,类型转换和Convert都可能在无法转换输入对象时抛出异常。但是,如果int.TryParse失败,它不会抛出异常;而是返回false(但是它只接受一个字符串,因此您必须在使用之前将输入对象转换为字符串:.ToString()):

object s = "1";
int i;
if(int.TryParse(s.ToString(), out i))
{
   // i now has a value of 1
}

你要找的词是第二段中的“明确”,隐式的话就是 int i = s - anon

11

它们在本质上是不同的。

Casting 表示对象是要转换为的类型的实例,因此需要进行强制转换。

Convert 表示要转换的类型之间存在转换关系。

例如,您无法将字符串强制转换为整数,但可以进行转换。由于特定内置类型的强制转换规则或者可以添加到自己类型的显式强制转换,某些灰色地带存在重叠。但通常情况下我认为这两者不相等。

鉴于没有“更好”的选择,应该根据给定的上下文使用合适的选项。


11
我认为这是一个意图问题。转换明确表示“我知道你是一个'int'!”,而强制类型转换说:“我不知道你是什么,但最终我知道你会成为一个'int'”。 - Greg
是的 - 解释得非常好 - 谢谢。 - James Gaunt

1

只有当原始类型为新类型定义了强制转换时,才能进行强制转换。因此,通常可以将一种数值类型转换为另一种数值类型(例如,将 long 转换为 int),但通常无法将非数值类型转换为数值类型(例如,将 string 转换为 int)。Convert 提供了更多的方法来将这些非数值类型转换为数值类型,因此使用它的原因是您不太可能遇到错误。


1

我个人更倾向于使用Convert,因为它提供了一个良好的转换统一接口。例如:Convert.ToInt32("45")可以正常工作,但(int)"45"会报错。

Convert还会报告异常,如抛出OverflowException。强制类型转换很危险,例如从长整型转换成整型可能会导致错误的结果,并且运行时不会告诉你。

我也喜欢Convert.ToX(object obj)的存在,这样您只需将对象传递给Convert,大多数情况下就可以忘记它。


2
在你的第二个语句中,你所说的在默认情况下是正确的,但你可以将强制转换包装在一个"checked"块中,在这种情况下会抛出一个ArithmeticOverflowException异常。 - KeithS

1

Convert.ToInt32基本上与int.Parse相同,只有一个区别:如果使用int.Parse(null),则会抛出异常,而Convert.ToInt32返回0

另一方面,强制转换是一种更复杂的操作,只有在值确实是已装箱的int或另一个(已装箱/未装箱)可以隐式转换的值类型时才能起作用。

(装箱是值类型的对象表示)


1
Convert是一个包含一系列静态方法的类,旨在用于转换基本类型,支持的类型包括Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal、DateTime和String。 强制转换运算符允许您做同样的事情,但您也可以将其用于其他类型,包括您创建的类型。您还可以在自己的类中定义这些运算符,从而允许您将任何东西转换为任何东西。 所以这就是区别,一个是方法,另一个是运算符,我没有检查将int转换为字符串时运算符的内部逻辑,但它可能与Convert中的方法具有相同的逻辑。

0
如果您知道包装实例是int类型,那么您可以安全地使用(int)转换运算符对其进行拆箱操作。但是,如果它“可转换为int”(例如float),使用转换运算符将在运行时失败。
请查看Convert类文档,了解有关其允许和禁止的特定转换的更多详细信息。

0

区别在于Convert.ToInt32(object value)尝试使用IConvertible将值转换为int,而直接强制转换将仅在此类转换无效时引发异常。

其他重载也尝试转换而不是强制转换


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接