今天在工作中出现了一个关于如何将对象转换为特定类型(int
)的问题,我说要施展它:
int i = (int)object;
一位同事说要使用Convert.ToInt32()
。
int i = Convert.ToInt32(object)
Convert.ToInt32()
与直接投射对象之间的区别是什么?
答案 0 :(得分:16)
并非每个对象都可以直接投射到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
}
答案 1 :(得分:10)
它们根本不同
Casting说对象是要转换为的类型的实例,所以强制转换它。
转换表示正在转换的类型之间存在转换。
因此,例如,您不能将字符串转换为int,但您可以转换它。由于原始类型的某些内置强制转换规则或您可以添加到自己类型的显式强制转换,因此存在一些灰色区域/重叠。但一般来说,我不认为这两者是等价的。
鉴于没有“更好”的选项,您应该使用在给定上下文中有意义的选项。
答案 2 :(得分:1)
只有在原始类型具有为新类型定义的强制转换时才能进行强制转换。因此,通常可以从一种数字类型转换为另一种数字类型(例如,long到int),但通常不可能从非数字类型转换为数字类型(例如,字符串到int)。转换提供了更多方法来将这些非数字类型更改为数字,因此使用它的原因是您不太可能收到错误。
答案 3 :(得分:1)
我倾向于选择Convert
,因为它为转换提供了一个很好的统一界面。例如,Convert.ToInt32("45")
有效但(int)"45"
无效。
Convert
还会报告投放OverflowException
等问题。转换可能很危险,因为从长到一个int转换可能会产生一个糟糕的结果,并且运行时不会告诉你。
我也希望Convert.ToX(object obj)
存在,这样您就可以将事情发送到Convert
,并且大部分都会忘记它。
答案 4 :(得分:1)
Convert.ToInt32与int.Parse基本相同 有一点不同:如果使用int.Parse(null)则抛出异常,而Convert.ToInt32返回0
另一方面,转换是一个更复杂的操作,只有当值实际上是一个可以隐式转换的盒装int或anohter(盒装/非盒装)值类型时才会起作用。
(装箱是值类型的对象表示)
答案 5 :(得分:1)
Convert是一个包含一系列静态方法的类,用于转换基类型,支持的类型是Boolean,Char,SByte,Byte,Int16,Int32,Int64,UInt16,UInt32,UInt64,Single ,Double,Decimal,DateTime和String。 强制转换操作符允许您执行相同的操作,但您也可以将其用于其他类型,包括您创建的类型。您还可以在类中定义此运算符,从而允许您将任何内容转换为任何内容。 这就是差异,一个是方法,另一个是运算符,我在转换和int时没有检查操作的内容,但它可能与Convert中的方法具有相同的逻辑。
答案 6 :(得分:0)
如果你知道盒装实例是一个int,你可以安全地使用(int)
强制转换操作符来取消它。但是,如果它可转换为int (例如浮点数),则使用强制转换操作符将在运行时失败。
查看Convert
课程文档,了解有关允许和禁止的特定转化的详细信息。
答案 7 :(得分:0)
差异是Convert.ToInt32(object value)
将尝试使用IConvertible
将值转换为int,因为如果此类强制转换无效,则直接强制转换只会抛出异常。
其他重载也会尝试转换而不是转换。