为什么(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
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*own 20
如果你这样做:
string s = (string)70;
Run Code Online (Sandbox Code Playgroud)
你期望在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);
Run Code Online (Sandbox Code Playgroud)
这意味着它将使用基数10表示法将数字转换为字符串.如果数字为负数,则在开头显示" - ",否则只显示数字.但是,如果转换为二进制,八进制或十六进制,则负数将以二进制补码显示,因此Convert.ToString(-7,16)变为"ffffffba".
另一个"漫长的方法"是使用ToString和字符串格式化程序,如下所示:
string s2 = 70.ToString("D");
Run Code Online (Sandbox Code Playgroud)
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 - 标准数字格式字符串.
Dan*_*ert 11
当执行(string)30
类似的强制转换操作时,你基本上告诉计算机"这个对象与我正在投射的对象相似,我不会丢失太多(或任何)数据/功能".
将数字转换为字符串时,数据中存在"丢失".字符串不能执行数学运算,也不能执行数字相关的操作.
这就是为什么你可以这样做:
int test1 = 34;
double test2 = (double)test1;
Run Code Online (Sandbox Code Playgroud)
但不是这个:
int test1 = 34;
string test2 = (string)test1;
Run Code Online (Sandbox Code Playgroud)
这个例子并不完美,因为(IIRC)这里的转换是隐含的,但是想法是当转换为double时,你不会丢失任何信息.无论是a double
还是a,该数据类型仍然可以基本上起作用int
.同样不能说a int
到a string
.
只有在转换完成后不会丢失太多功能时,才允许(通常)进行转换.
该.ToString()
方法与强制转换不同,因为它只是一种返回string
数据类型的方法.