无法将类型 "string" 转换为 "int"。
string name = Session["name1"].ToString();
int i = (int)name;
以下代码编译并成功运行:
string name = Session["name1"].ToString();
int i = Convert.ToInt32(name);
我想知道:
第一段代码为什么会产生编译时错误?
这两段代码片段有何不同?
string name = Session["name1"].ToString();
int i = (int)name;
以下代码编译并成功运行:
string name = Session["name1"].ToString();
int i = Convert.ToInt32(name);
我想知道:
第一段代码为什么会产生编译时错误?
这两段代码片段有何不同?
(int)foo
简单地将变量 foo
强制转换为 Int32
(在 C# 中使用 int
)。这个操作是内置于 CLR 中的,需要变量 foo
是数字类型(例如 float
,long
等)。在这个意义上,它与 C 语言中的强制转换非常相似。
Convert.ToInt32
被设计为通用转换函数。它做的事情比仅仅进行类型强制转换要多得多;它可以从 任何 基本数据类型转换为 int
(尤其是解析一个 string
)。您可以在 MSDN 上看到该方法的完整重载列表。
正如 Stefan Steiger 在一条评论中所提到的:
此外,值得注意的是,在数值级别上,
(int) foo
截断foo
(即ifoo = Math.Floor(foo)
),而Convert.ToInt32(foo)
使用银行家舍入法(将 x.5 四舍五入到最接近的偶数,这意味着ifoo = Math.Round(foo)
)。因此,结果不仅在实现上不同,而且在数值上也不相同。
(这一行涉及到一个被合并的问题) 你绝不应该使用 (int)someString
- 那永远都不会起作用(编译器也不会让你通过)。
然而,int int.Parse(string)
和 bool int.TryParse(string, out int)
(以及它们的各种重载)是可行的。
就我个人而言,我主要只在处理反射时使用 Convert
,所以对我来说选择是 Parse
和 TryParse
。当我期望值是有效的整数并且希望它在无效时抛出异常时,我使用第一个。当我想要检查它是否为有效的整数时,我可以决定在它是/否时该怎么做。
Convert
时使用”,还是我没有理解? - Dax FohlConvert
,那么几乎肯定是与反射一起使用的。我理解这意味着,作为更通用的接口,当您不知道是否需要将某个值转换为int
、double
、其他某些基本类型或某些用户类型直到运行时时,它非常有用。例如,Convert.ChangeType()
对此非常有用。 - binkiConvert.ToInt32("Hello");
这将导致参数异常。
总之,从字符串转换为整数是一个框架问题,而不是 .Net 类型系统中隐含的内容。
一个字符串不能通过显式转换被转换为整数。必须使用 int.Parse
进行转换。
Convert.ToInt32
基本上包装了这个方法:
public static int ToInt32(string value)
{
if (value == null)
{
return 0;
}
return int.Parse(value, CultureInfo.CurrentCulture);
}
您在谈论C#类型转换与.NET转换工具之间的区别。
(类型转换)语法适用于数字数据类型,以及“兼容”的数据类型。 兼容意味着通过继承(即基类/派生类)或实现(即接口)建立了关系的数据类型。
类型转换也可以在具有转换运算符定义的不同数据类型之间进行。
另一方面,System.Convert类是许多可用机制中的一种,用于以一般意义上的方式进行转换;它包含了逻辑,可以在逻辑上将可以从一种形式转换为另一种形式的已知不同数据类型之间进行转换。
转换甚至涵盖了与强制转换相同的内容,允许在类似数据类型之间进行转换。
1) C# 是一种类型安全的语言,不允许将字符串赋值给数字。
2) 第二种情况将字符串解析为新变量。如果您的 Session 是 ASP.NET 会话,则无需在其中存储字符串并在检索时将其转换回来。
int iVal = 5;
Session[Name1] = 5;
int iVal1 = (int)Session[Name1];
.NET 中没有默认的从字符串到整数的转换。您可以使用 int.Parse() 或 int.TryParse() 来完成此操作。或者,就像您所做的那样,您可以使用 Convert.ToInt32()。
然而,在您的示例中,为什么要先进行 ToString() 然后再将其转换回整数呢?您可以简单地将整数存储在 Session 中,并按如下方式检索它:
int i = Session["name1"];
using System;
public class Program
{
public static void Main()
{
double cost = 49.501;
Console.WriteLine(Convert.ToInt32(cost));
Console.WriteLine((int)cost);
}
}
输出
50
49
Convert.ToInt32()
和(Int32.Parse
或Int32.TryParse()
)之间有什么区别 :-) - Joey