4

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

9 回答 9

39

因为没有定义从 Int32 到字符串的类型转换。这就是 ToString 方法的用途。

于 2009-01-30T15:16:00.390 回答
21

如果你这样做:

string s = (string)70;

你希望在 s 中有什么?

A. “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 - 标准数字格式字符串

于 2009-01-30T15:45:25.493 回答
11

在执行类似的转换操作时(string)30,您基本上是在告诉计算机“这个对象与我要转换的对象足够相似,我不会丢失太多(或任何)数据/功能”。

将数字转换为字符串时,数据会“丢失”。字符串不能进行数学运算,也不能做与数字相关的事情。

这就是为什么你可以这样做:

int test1 = 34;
double test2 = (double)test1;

但不是这个:

int test1 = 34;
string test2 = (string)test1;

这个例子并不完美,因为(IIRC)这里的转换是隐式的,但是这个想法是当转换为双精度时,您不会丢失任何信息。无论是 adouble还是 ,该数据类型基本上仍然可以发挥相同的作用int。不能int对 a说同样的话string

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

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

于 2009-01-30T15:22:34.777 回答
5

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

于 2009-01-30T15:16:13.540 回答
5

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

我知道从 C# 开始(并且来自 C++)时,我发现自己遇到了看起来应该有效的类型转换。C++ 在这类事情上稍微自由一些,所以在 C# 中,设计者希望你知道什么时候你的类型转换是模棱两可的或不明智的。然后 Convert 类型通过允许您显式转换和理解副作用来填补空白。

于 2009-01-30T15:57:51.397 回答
4

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

于 2009-01-30T15:16:38.080 回答
4

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

为什么会这样,你会问原因很简单,int32 是整数/数字类型,而字符串是,哦,好吧,类型是字符串/字符。您可能能够从数值类型转换为另一种数值类型(例如,浮点数转换为整数,但请注意可能会丢失准确性)。如果在编译器中编码的所有可能的转换,编译器将变得太慢,并且肯定会错过为用户定义的类型创建的许多可能的转换,这是一个主要的 NO NO。

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

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

于 2009-01-30T15:33:51.930 回答
2

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

IE...

int intMyInt=32;

string strMyString = intMyInt.ToString();
于 2010-08-24T10:40:35.390 回答
-1

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

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

于 2010-08-24T10:34:35.670 回答