Convert.ToInt32和(int)有什么区别?

下面的代码会引发一个编译时错误

无法将types“string”转换为“int”

string name = Session["name1"].ToString(); int i = (int)name; 

而下面的代码编译并成功执行:

 string name = Session["name1"].ToString(); int i = Convert.ToInt32(name); 

我想知道:

  1. 为什么第一个代码会产生编译时错误?

  2. 这两个代码片段有什么区别?

(int)foo只是对Int32int在C#中)types的Int32 。 这是内置到CLR中的,并且要求foo是一个数字variables(例如floatlong等)。从这个意义上讲,它和C中的一个types非常相似。

Convert.ToInt32被devise成一个通用的转换函数。 它比铸造要好得多。 即它可以从任何原始types转换为一个int (最值得注意的是,parsing一个string )。 您可以在MSDN上查看此方法的重载完整列表。

(这一行涉及到合并的问题)你不应该使用(int)someString – 这将永远不会工作(编译器不会让你)。

但是, int int.Parse(string)bool int.TryParse(string, out int) (及其各种重载)是公平的游戏。

就我个人而言,我主要只使用Convert当我处理reflection,所以对我来说,select是ParseTryParse 。 首先是当我期望值是一个有效的整数,并希望它抛出一个例外,否则。 第二个是当我想检查它是否是一个有效的整数时,我可以决定在/不是的时候该怎么做。

引用Eric Lippert的文章 :

投射意味着两个相互矛盾的事物:“检查这个对象是否真的是这种types,如果不是这个types,那么抛出”,“这个对象不是给定的types;find一个属于给定types的等价值”。

所以你在1)中要做的是断言是一个String是一个Int。 但是这个断言失败,因为string不是一个int。

原因2)成功是因为Convert.ToInt32()parsingstring并返回一个int。 它仍然可能失败,例如:

 Convert.ToInt32("Hello"); 

会导致一个参数exception。

总而言之,从String转换为Int是一个框架问题,而不是在.Nettypes系统中隐含的东西。

你正在谈论一个C#转换操作与.NET转换工具

  • C#语言级别的转换使用括号(例如(int)),并且转换支持受到限制,依赖于types之间的隐式兼容性,或者由开发人员通过转换运算符显式定义指令。
  • .NET Framework中存在许多转换方法,例如System.Convert ,以允许在相同或不同数据types之间进行转换

(Casting)语法适用于数字数据types,也适用于“兼容”数据types。 兼容是指通过inheritance(即基类/派生类)或通过实现(即接口)build立关系的数据types。

Casting也可以在定义了转换运算符的不同数据types之间工作。

另一方面, System.Convert类是一般意义上转换事物的许多可用机制之一; 它包含在不同的,已知的数据types之间进行转换的逻辑,这些数据types可以在逻辑上从一种forms转换为另一种forms。

转换甚至涵盖了与转换类似的数据types之间的转换相同的理由。


请记住,C#语言有自己的方式来做一些事情。
除了任何编程语言之外,底层的.NET Framework都有自己的做事方式。
(有时他们的意图重叠。)

将Cast视为本质上更受限制的C#语言级function,并将其作为.NET Framework中许多可用机制之一,通过System.Convert类进行转换,以在不同types之间转换值。

一个string不能通过显式的强制转换为一个int。 它必须使用int.Parse转换。

Convert.ToInt32基本上包装了这个方法:

 public static int ToInt32(string value) { if (value == null) { return 0; } return int.Parse(value, CultureInfo.CurrentCulture); } 

.NET中没有从string到int的默认转换。 你可以使用int.Parse()或int.TryParse()来做到这一点。 或者,正如你所做的那样,你可以使用Convert.ToInt32()。

然而,在你的例子中,为什么要做一个ToString(),然后把它转换回一个int呢? 您可以简单地将该int存储在Session中,并按如下方式检索它:

 int i = Session["name1"]; 

只是一个简单的额外:在不同的情况下(例如,如果你正在转换一个double,&c到一个Int32),你可能还需要担心在这两者之间select四舍五入。 Convert.Int32将使用银行家舍入( MSDN ); (int)将会截断为一个整数。

1)C#是types安全的语言,不允许你指定string到数字

2)第二种情况将stringparsing为新的variables。 在你的情况下,如果会话是ASP.NET会话,则不必在那里存储string,并在检索时将其转换回来

 int iVal = 5; Session[Name1] = 5; int iVal1 = (int)Session[Name1]; 

Convert.ToInt32

    返回int.Parse(值,CultureInfo.CurrentCulture);

但(int)是types转换,因此(int)“2”将不起作用,因为您不能将string转换为int。 但是你可以像Convert.ToInt32那样parsing它

不同的是,第一个片段是一个演员,第二个片段是一个转换。 虽然,我想也许编译器的错误在这里提供更多的困惑,因为措辞。 也许它会更好,如果它说:“不能将types的string转换为”int“。

这是旧的,但另一个区别是,如果你有一个双ej,(int)不会把数字舍去:5.7使用(int)的输出将是5,如果你使用Convert.ToInt(),数字将会是到6。