English 中文(简体)
为什么 (string)int32 总是会抛出错误:无法将类型 int 转换为 string。
原标题:
  • 时间:2009-01-30 15:14:36
  •  标签:

为什么 (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到字符串没有定义类型转换。这就是ToString方法的作用。

如果你做了这件事:

string s = (string)70;

你会期望在s中有什么?

A. "70" the number written the way humans would read it.
B. "+70" the number written with a positive indicator in front.
C. "F" the character represented by ASCII code 70.
D. "x00x00x00F" the four bytes of an int each separately converted to their ASCII representation.
E. "x0000F" the int split into two sets of two bytes each representing a Unicode character.
F. "1000110" the binary representation for 70.
G. "$70" the integer converted to a currency
H. Something else.

编译器无法自动识别,所以必须采用较长的方式手动完成。

有两种“长途旅行”。第一种是使用 Convert.ToString() 之类的一个重载,就像这样:

string s = Convert.ToString(-70, 10);

这意味着它将使用10进制符号把数字转换成字符串。如果数字为负数,则在开头显示“-”,否则只显示数字。但是,如果转换为二进制、八进制或十六进制,负数将以二进制补码的形式显示,因此Convert.ToString(-7, 16)会变成“ffffffba”。

另一种“长途旅行”的方法是使用ToString和字符串格式化程序,例如:

string s2 = 70.ToString("D");

D是格式化器代码,告诉ToString方法如何转换为字符串。以下列出了一些有趣的代码:

"D" Decimal format which is digits 0-9 with a "-" at the start if required. E.g. -70 becomes "-70".
"D8" I ve shown 8 but could be any number. The same as decimal, but it pads with zeros to the required length. E.g. -70 becomes "-00000070".
"N" Thousand separators are inserted and ".00" is added at the end. E.g. -1000 becomes "-1,000.00".
"C" A currency symbol is added at the start after the "-" then it is the same as "N". E.g. Using en-Gb culture -1000 becomes "-£1,000.00".
"X" Hexadecimal format. E.g. -70 becomes "46".

注意:这些格式取决于当前的文化设置,如果你使用的是en-US,当使用格式代码“C”时,你会得到一个“$”而不是“£”。

有关格式代码的更多信息,请参见MSDN-标准数字格式字符串

当执行类似于(string)30的转换操作时,你基本上是在告诉计算机:“被转换的对象与我所转换成的对象足够相似,以至于我不会失去太多(或任何)数据/功能。”

当将数字转换为字符串时,会出现数据 "损失"。 字符串无法执行数学运算,也不能执行与数字相关的操作。

这就是你可以做到这个原因:

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

但不是这个:

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

这个例子并不完美,因为(如果我没记错的话)这里的转换是隐含的,但是这个想法是,当转换为双精度时,不会丢失任何信息。那种数据类型仍然可以像是 doubleint 一样基本操作。 但不能将 int 转换为 string

通常只有在转换完成后不会失去太多功能时才允许投射。

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

另一个注意事项:通常,如果您想要执行这样的显式转换(我同意其他答案中的许多观点,说明为何需要进行显式转换),不要忽略Convert类型。它专门设计用于这些原始/简单类型的转换。

我知道当开始使用C#(并来自C ++)时,我发现自己遇到了看起来应该有效的类型转换。 C ++在处理这种事情时有点更加宽松,因此在C#中,设计师希望您知道何时您的类型转换是模棱两可或不明智的。 Convert类型然后通过允许您显式转换并理解副作用来填补空白

它没有显式的转为字符串的操作符。但是,它们有Int32.ToString()。如果你确实想要的话,也许你可以用扩展方法创建一个。

因为C#不知道如何将int转换为string,库(.ToString)可以做到。

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

Why is that, you will ask the reason is simple int32 is type integer/numerical and string is, oh well type string/characters. You may be able to convert from numerical type to another numerical type (ex. float to int, but be warned possible loss of accuracy). If all possible casts where coded in the compiler the compiler would become too slow and certainly would miss much of the possible casts created for user defined types which is a major NO NO.

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

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

我刚找到了答案。ToString在int变量上有效。你只需要确保添加方括号。

对于例子。

int intMyInt=32;

string strMyString = intMyInt.ToString();

VB .net 完全可以将 int 强制转换为 string... 实际上 Java 也可以。为什么 C# 会有问题呢?有时在计算中需要使用数字值,然后以字符串格式显示结果。否则您如何在 TextBox 中显示计算结果呢?

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





相关问题
热门标签