以下代码会引发编译时错误,例如
无法将类型“字符串”转换为“整数”
string name = Session["name1"].ToString(); int i = (int)name;
而下面的代码可以编译并成功执行:
string name = Session["name1"].ToString(); int i = Convert.ToInt32(name);
我想知道:
为什么第一个代码会生成编译时错误?
这两个代码段之间有什么区别?
(int)foo只是转换为Int32(int在C#中)类型。这是建立在CLR和要求foo是数字变量(例如float,long等),在这个意义上,它是非常类似于C的投
(int)foo
Int32
int
foo
float
long
Convert.ToInt32设计为通用转换函数。它比铸造更重要。也就是说,它可以从 任何 原始类型转换为a int(最著名的是解析a string)。您可以在MSDN上查看此方法的重载的完整列表。
Convert.ToInt32
string
正如Stefan Steiger 在评论中提到的那样:
另外,请注意,在数值级别上,(int) foo截断foo(ifoo = Math.Floor(foo)),而Convert.ToInt32(foo)使用一半至偶数舍入(将x.5 舍入为最接近的EVEN整数,即ifoo = Math.Round(foo))。因此,结果不仅在实现方面,而且在数值上 也不 相同。
(int) foo
ifoo = Math.Floor(foo)
Convert.ToInt32(foo)
ifoo = Math.Round(foo)