C# 为什么使用Convert.ToInt32进行转换?

C# 为什么使用Convert.ToInt32进行转换?,c#,.net,casting,C#,.net,Casting,今天工作中突然出现了一个问题,关于如何将对象转换为其特定类型(anint),我说要强制转换它: int i = (int)object; 一位同事说要使用Convert.ToInt32() Convert.ToInt32()和直接对象强制转换有什么区别?不是每个对象都可以直接强制转换到int。例如,以下内容将不会编译: string s = "1"; int i = (int)s; 因为string不能隐式转换为int 但是,这是合法的: string s = "1"; int i = Co

今天工作中突然出现了一个问题,关于如何将对象转换为其特定类型(an
int
),我说要强制转换它:

int i = (int)object;
一位同事说要使用
Convert.ToInt32()


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

不是每个对象都可以直接强制转换到
int
。例如,以下内容将不会编译:

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

但是,这是合法的:

string s = "1";
int i = Convert.ToInt32(s);
另外,如果无法转换输入对象,则强制转换和转换都会引发异常。但是,
int.TryParse
如果失败则不会抛出;相反,它返回false(但它只接受一个字符串,因此在使用它之前必须
.ToString()
您的输入对象):


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

如果您知道已装箱的实例是int,则可以安全地使用
(int)
强制转换运算符取消装箱。但是,如果它可以转换为int(例如float),那么在运行时使用cast操作符将失败


查看
Convert
类文档,了解它允许和不允许的具体转换的更多详细信息。

我倾向于选择
Convert
自己,因为它提供了一个很好的统一转换接口。例如,
Convert.ToInt32(“45”)
有效,但
(int)“45”
无效

Convert
还将报告抛出
OverflowException
等问题。强制转换可能是危险的,因为从say long到int的强制转换可能会产生很差的结果,并且运行时不会告诉您


我也喜欢
Convert.ToX(objectobj)
的存在,它让你只需把东西发射到
Convert
就可以了,而且在很大程度上忘记它。

它们是根本不同的

强制转换表示对象是要强制转换到的类型的实例,所以强制转换它

Convert表示正在转换的类型之间存在转换

例如,您不能将字符串强制转换为int,但可以将其转换。由于基本类型的某些内置强制转换规则,或者您可以添加到自己的类型中的显式强制转换转换,存在一些灰色区域/重叠。但总的来说,我不认为这两者是等价的


如果没有“更好”选项,您应该使用在给定上下文中有意义的选项。

区别在于转换。ToInt32(对象值)将尝试使用
IConvertible
将值转换为int,如果这种转换无效,as直接转换将简单地抛出异常


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

Convert.ToInt32基本上与int.Parse相同 有一个区别:如果使用int.Parse(null),将引发异常,而Convert.ToInt32返回0

另一方面,强制转换是一个更复杂的操作,仅当值确实是可以隐式转换的装箱int或anohter(装箱/未装箱)值类型时才起作用


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

Convert是一个包含一系列静态方法的类,用于转换基类型,支持的类型有Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal、DateTime和String。 cast操作符允许您执行相同的操作,但也可以将其用于其他类型,包括您创建的类型。您还可以在类中定义此运算符,允许您从任意对象转换为任意对象。
这就是区别,一个是方法,另一个是运算符,我在将和int转换为字符串时没有检查运算符的细节,但它可能与Convert中的方法具有相同的逻辑。

关于第二条语句;在默认情况下,您所说的是正确的,但是您可以将强制转换封装在一个“checked”块中,在这种情况下,它将抛出算术OverflowException。我认为这是一个意图问题。演员明确地说“我知道你是一个
int
!”而Convert说“我不知道你是什么,但最终我知道你会是一个
int
”是的-非常好的解释方式-谢谢。你要找的单词是第二个“段落”中的“显式”-隐式应该是
int I=s
string s = "1";
int i = Convert.ToInt32(s);
object s = "1";
int i;
if(int.TryParse(s.ToString(), out i))
{
   // i now has a value of 1
}