为什么(string)int32总是抛出:无法将类型'int'转换为'string'
public class Foo
{
private int FooID;
public Foo()
{
FooID = 4;
string s = (string)FooID; //throws compile error
string sss = FooID.ToString(); //no compile error
}
}
答案 0 :(得分:39)
因为没有从Int32到string定义的类型转换。这就是ToString方法的用途。
答案 1 :(得分:20)
如果你这样做了:
string s = (string)70;
你期望在s中做什么?
一个。 “70”这个数字就像人类读它的方式一样
B.“+ 70”前面写有正面指示的数字。
C.“F”由ASCII code 70代表的字符
D.“\ x00 \ x00 \ x00F”一个int的四个字节,每个字节分别转换为它们的ASCII表示
E.“\ x0000F”int分为两组,每组两个字节,每个字节代表一个Unicode字符
F.“1000110”70的二进制表示
G.“$ 70”整数转换为货币
H.别的东西。
编译器无法分辨,所以它可以让你做到很久。
有两种“长路”。第一种是使用Convert.ToString()重载之一,如下所示:
string s = Convert.ToString(-70, 10);
这意味着它将使用基数10表示法将数字转换为字符串。如果数字为负数,则在开头显示“ - ”,否则只显示数字。但是,如果转换为二进制,八进制或十六进制,则在twos complement中显示负数,因此Convert.ToString(-7,16)变为“ffffffba”。
另一个“漫长的方法”是使用ToString和字符串格式化器:
string s2 = 70.ToString("D");
D是格式化程序代码,它告诉ToString方法如何转换为字符串。下面列出了一些有趣的代码:
“D”十进制格式,如果需要,为数字0-9,开头为“ - ”。例如。 -70变为“-70”。
“D8”我已经显示了8但可能是任何数字。与十进制相同,但它用零填充到所需的长度。例如。 -70变为“-00000070”
插入“N”千个分隔符,最后添加“.00”。例如。 -1000变为“-1,000.00”
“C”在“ - ”之后的开头添加货币符号,然后它与“N”相同。例如。使用en-Gb培养-1000变为“ - £1,000.00”
“X”十六进制格式。例如。 -70变成“46”。
注意:这些格式取决于当前的文化设置,因此如果您使用en-Us,则在使用格式代码“C”时将获得“$”而不是“£”。
有关格式代码的详细信息,请参阅MSDN - Standard Numeric Format Strings。
答案 2 :(得分:11)
当执行像(string)30
这样的强制转换操作时,你基本上告诉计算机“这个对象与我正在投射的对象足够相似,我不会丢失太多(或任何)数据/功能”。
将数字转换为字符串时,数据中存在“丢失”。字符串不能执行数学运算,也不能执行数字相关的操作。
这就是你可以这样做的原因:
int test1 = 34;
double test2 = (double)test1;
但不是这样:
int test1 = 34;
string test2 = (string)test1;
这个例子并不完美,因为(IIRC)这里的转换是隐含的,但是想法是当转换为double时,你不会丢失任何信息。无论是double
还是int
,该数据类型仍然可以基本相同。对于int
到string
,
只有在转换完成后不会失去太多功能时才允许进行转换。
.ToString()
方法与强制转换不同,因为它只是一种返回string
数据类型的方法。
答案 3 :(得分:5)
Int没有明确的字符串运算符。但是,他们有Int32.ToString();.如果真的想要,也许你可以使用Extension方法创建一个。
答案 4 :(得分:5)
另一个注意事项:一般情况下,如果您想进行这样的显式转换(我同意其他许多答案,为什么需要进行显式转换)不要忽略Convert类型。它专为这些原始/简单类型转换而设计。
我知道,当从C#开始(并且来自C ++)时,我发现自己遇到的类型转换似乎应该有效。当涉及到这类事情时,C ++会更加自由,所以在C#中,设计师希望您知道何时类型转换模糊或不明智。转换类型然后允许您显式转换和理解副作用来填补空白。
答案 5 :(得分:4)
因为C#不知道如何将int转换为字符串,所以库(.ToString)会这样做。
答案 6 :(得分:4)
Int32无法转换为字符串,因为C#编译器不知道如何从一种类型转换为另一种类型。
为什么会这样,你会问原因是简单的int32是类型整数/数字和字符串是,哦,好类型字符串/字符。您可以将数字类型转换为另一种数字类型(例如float到int,但要注意可能会丢失准确性)。 如果在编译器中编码的所有可能的强制转换编译器将变得太慢并且肯定会错过为用户定义的类型创建的大部分可能的强制转换,这是一个主要的NO NO。
所以解决方法是C#中的任何对象都有一个继承.ToString()的函数,它知道如何处理每个类型,因为.ToString()是针对特定类型专门编码的,正如你现在猜测的那样返回一个字符串。
毕竟Int32类型是内存中的一些位(确切地说是32位),字符串类型是另一堆位(多少位取决于已分配了多少),编译器/运行时不知道任何事情直到现在,我们一直在查看这些数据.ToString()函数访问从一个转换为另一个所需的特定元数据。
答案 7 :(得分:2)
我刚刚找到答案。 ToString在int变量上工作正常。您只需确保添加括号。
...即
int intMyInt=32;
string strMyString = intMyInt.ToString();
答案 8 :(得分:-1)
VB .net完全能够从int转换为字符串......事实上Java也是如此。为什么C#有问题呢?有时需要在计算中使用数值,然后以字符串格式显示结果。你怎么能设法在TextBox中显示计算结果?
这里给出的回答毫无意义。必须有一种方法将int转换为字符串。