为什么(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 } }
mqp.. 39
因为没有从Int32到string定义的类型转换.这就是ToString方法的用途.
因为没有从Int32到string定义的类型转换.这就是ToString方法的用途.
如果你这样做:
string s = (string)70;
你期望在s?
答:"70"这个数字的编写方式与人类阅读它的方式相同.
B."+ 70"前面写有正面指示的数字.
C."F"由ASCII码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表示法将数字转换为字符串.如果数字为负数,则在开头显示" - ",否则只显示数字.但是,如果转换为二进制,八进制或十六进制,则负数将以二进制补码显示,因此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 - 标准数字格式字符串.
当执行(string)30
类似的强制转换操作时,你基本上告诉计算机"这个对象与我正在投射的对象相似,我不会丢失太多(或任何)数据/功能".
将数字转换为字符串时,数据中存在"丢失".字符串不能执行数学运算,也不能执行数字相关的操作.
这就是为什么你可以这样做:
int test1 = 34; double test2 = (double)test1;
但不是这个:
int test1 = 34; string test2 = (string)test1;
这个例子并不完美,因为(IIRC)这里的转换是隐含的,但是想法是当转换为double时,你不会丢失任何信息.无论是a double
还是a,该数据类型仍然可以基本上起作用int
.同样不能说a int
到a string
.
只有在转换完成后不会丢失太多功能时,才允许(通常)进行转换.
该.ToString()
方法与强制转换不同,因为它只是一种返回string
数据类型的方法.
Int没有明确的字符串运算符.但是,他们有Int32.ToString();. 也许你可以用扩展方法创建一个,如果你真的想.
只是另一个注意事项:一般来说,如果你想做这样的显式转换(我同意这里的许多其他答案,为什么它需要显式转换)不要忽略转换类型.它专为这些原始/简单类型转换而设计.
我知道,当从C#开始(并且来自C++)时,我发现自己遇到了类型转换,看起来它们应该有效.当涉及到这类事情时,C++会更加自由,所以在C#中,设计师希望您知道何时类型转换模糊或不明智.然后,转换类型允许您显式转换和理解副作用,从而填补空白.