繁体   English   中英

为什么(string)int32总是抛出:无法将类型'int'转换为'string'

[英]Why does (string)int32 always throw: Cannot convert type 'int' to 'string'

为什么(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
        }
    }

因为没有从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时,你不会丢失任何信息。 无论是double还是int该数据类型仍然可以基本上相同。 stringint不能说同样的。

只有在转换完成后不会丢失太多功能时,才允许(通常)进行转换。

.ToString()方法与强制转换不同,因为它只是一个返回string数据类型的方法。

Int没有明确的字符串运算符。 但是,他们有Int32.ToString();. 也许你可以用扩展方法创建一个,如果你真的想。

只是另一个注意事项:一般来说,如果你想做这样的显式转换(我同意这里的许多其他答案,为什么它需要显式转换) 不要忽略转换类型 它专为这些原始/简单类型转换而设计。

我知道,当从C#开始(并且来自C ++)时,我发现自己遇到了类型转换,看起来它们应该有效。 当涉及到这类事情时,C ++会更加自由,所以在C#中,设计师希望您知道何时类型转换模糊或不明智。 然后,转换类型允许您显式转换和理解副作用 ,从而填补空白。

因为C#不知道如何将int转换为字符串,所以库(.ToString)可以。

Int32无法转换为字符串,因为C#编译器不知道如何从一种类型转换为另一种类型。

为什么会这样,你会问原因是简单的int32是类型整数/数字和字符串是,哦,好类型字符串/字符。 您可以将数字类型转换为另一种数字类型(例如float到int,但要注意可能会丢失准确性)。 如果在编译器中编码的所有可能的强制转换编译器将变得太慢并且肯定会错过为用户定义的类型创建的大部分可能的强制转换,这是主要的NO NO。

因此,解决方法是C#中的任何对象都有一个继承.ToString()的函数,它知道如何处理每个类型,因为.ToString()是针对特定类型专门编码的,正如您现在猜测的那样返回一个字符串。

在所有Int32类型都是内存中的某些位(确切地说是32位)并且字符串类型是另一堆位(多少位取决于已分配了多少)后,编译器/运行时不知道任何事情本身只是看着那个数据到现在为止。 .ToString()函数访问从一个转换为另一个所需的特定元数据。

我刚刚找到了答案。 ToString在int变量上工作正常。 你只需要确保添加括号。

即...

int intMyInt=32;

string strMyString = intMyInt.ToString();

VB .net完全能够从int转换为字符串......实际上Java也是如此。 为什么C#有问题呢? 有时需要在计算中使用数值,然后以字符串格式显示结果。 你怎么能设法在TextBox中显示计算结果?

这里给出的回答毫无意义。 必须有一种方法将int转换为字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM