C# 为什么 (string)int32 总是抛出:Cannot convert type 'int' to 'string'
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/495852/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Why does (string)int32 always throw: Cannot convert type 'int' to 'string'
提问by tanbuckeye
Why does (string)int32 always throw: Cannot convert type 'int' to 'string'
为什么 (string)int32 总是抛出:Cannot convert type 'int' to '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
}
}
回答by mqp
Because there is no type conversion defined from Int32 to string. That's what the ToString method is for.
因为没有定义从 Int32 到字符串的类型转换。这就是 ToString 方法的用途。
回答by tsilb
Int doesn't have an explicit operator to string. However, they have Int32.ToString();. Maybe you can create one with Extension methods, if you reallywant to.
Int 没有显式的字符串运算符。但是,他们有 Int32.ToString();。如果您真的愿意,也许您可以使用扩展方法创建一个。
回答by Timbo
Because C# does not know how to convert int to string, the library (.ToString) does.
因为 C# 不知道如何将 int 转换为字符串,所以库 (.ToString) 知道。
回答by Dan Herbert
When performing a cast operation like (string)30
, you're basically telling the computer that "this object is similar enough to the object I'm casting to that I won't lose much (or any) data/functionality".
当执行像 之类的转换操作时(string)30
,您基本上是在告诉计算机“这个对象与我正在转换的对象足够相似,我不会丢失太多(或任何)数据/功能”。
When casting a number to a string, there is a "loss" in data. A string can not perform mathematical operations, and it can't do number related things.
将数字转换为字符串时,数据中存在“损失”。字符串不能进行数学运算,也不能做与数字相关的事情。
That is why you can do this:
这就是为什么你可以这样做:
int test1 = 34;
double test2 = (double)test1;
But not this:
但不是这个:
int test1 = 34;
string test2 = (string)test1;
This example isn't perfect since (IIRC) the conversion here is implicit, however the idea is that when converting to a double, you don't lose any information. That data type can still basically act the same whether it's a double
or an int
. The same can't be said of an int
to a string
.
这个例子并不完美,因为 (IIRC) 这里的转换是隐式的,但是这个想法是当转换为双精度时,你不会丢失任何信息。该数据类型无论是 adouble
还是int
. 不能说 anint
到 a string
。
Casting is (usually) only allowed when you won't lose much functionality after the conversion is done.
转换(通常)只有在转换完成后您不会失去太多功能时才允许。
The .ToString()
method is different from casting because it's just a method that returns a string
data type.
该.ToString()
方法与强制转换不同,因为它只是一种返回string
数据类型的方法。
回答by SMeyers
Int32 can't be casted to string because C# compiler doesn't know how to converter from one type to another.
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.
为什么会这样,你会问原因很简单,int32 是整数/数字类型,而字符串是,哦,好吧,类型是字符串/字符。您也许能够从数字类型转换为另一种数字类型(例如,float 到 int,但要注意可能会损失准确性)。如果所有可能的转换都在编译器中编码,编译器将变得太慢,并且肯定会错过为用户定义的类型创建的大部分可能的转换,这是一个主要的 NO NO。
So the workaround is that any object in C# has a function inherited .ToString() that knows how to handle every type because .ToString() is specifically coded for the specific type, and as you guessed by now returns a string.
所以解决方法是 C# 中的任何对象都有一个继承 .ToString() 的函数,它知道如何处理每种类型,因为 .ToString() 是专门为特定类型编码的,并且正如您现在猜测的那样返回一个字符串。
After all Int32 type is some bits in memory (32 bits to be exact) and string type is another pile of bits (how many bits depends on how much has been allocated) the compiler/runtime doesn't know anything just by itself looking at that data until now. .ToString() function accesses the specific metadata needed to convert from one to the other.
毕竟 Int32 类型是内存中的一些位(确切地说是 32 位),而字符串类型是另一堆位(多少位取决于已分配的数量),编译器/运行时仅靠自己看什么都不知道直到现在的数据。.ToString() 函数访问从一种转换到另一种所需的特定元数据。
回答by Martin Brown
If you did this:
如果你这样做:
string s = (string)70;
What would you expect to be in s?
你希望在 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. "\x00\x00\x00F" 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.
答:“70”是按照人类阅读方式书写的数字。
B.“+70”前面有正数的数字。
C. "F" ASCII 码 70表示的字符。
D. "\x00\x00\x00F" int 的四个字节分别转换为它们的 ASCII 表示。
E. "\x0000F" 将 int 分成两组,每组两个字节代表一个 Unicode 字符。
F. "1000110" 70 的二进制表示。
G. "$70" 转换为货币的整数
H. 别的东西。
The compiler can't tell so it makes you do it the long way.
编译器无法判断,所以它会让你做很长的路要走。
There are two "long ways". The first is to use one of the the Convert.ToString() overloads something like this:
有两条“长路”。第一种是使用 Convert.ToString() 重载之一,如下所示:
string s = Convert.ToString(-70, 10);
This means that it will convert the number to a string using base 10 notation. If the number is negative it displays a "-" at the start, otherwise it just shows the number. However if you convert to Binary, Octal or Hexadecimal, negative numbers are displayed in twos complementso Convert.ToString(-7, 16) becomes "ffffffba".
这意味着它将使用基数为 10 的表示法将数字转换为字符串。如果数字是负数,则在开头显示“-”,否则仅显示数字。但是,如果您转换为二进制、八进制或十六进制,负数将以二进制补码形式显示,因此 Convert.ToString(-7, 16) 变为“ffffffba”。
The other "long way" is to use ToString with a string formatter like this:
另一个“长路”是将 ToString 与这样的字符串格式化程序一起使用:
string s2 = 70.ToString("D");
The D is a formatter code and tells the ToString method how to convert to a string. Some of the interesting codes are listed below:
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".
"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”。
Note:These formats are dependent upon the current culture settings so if you are using en-Us you will get a "$" instead of a "£" when using format code "C".
注意:这些格式取决于当前的区域性设置,因此如果您使用 en-Us,当使用格式代码“C”时,您将得到“$”而不是“£”。
For more information on format codes see MSDN - Standard Numeric Format Strings.
有关格式代码的详细信息,请参阅MSDN-标准数字格式字符串。
回答by el2iot2
Just another note:In general, if you want to do an explicit conversion like this (and I agree with many other answers here as to why it needs to be an explicit conversion) don't overlook the Converttype. It is designed for these sorts of primitive/simple type conversions.
另一个注意事项:一般来说,如果您想做这样的显式转换(我同意这里的许多其他答案,为什么它需要显式转换)不要忽视Converttype。它是为这些类型的原始/简单类型转换而设计的。
I know that when starting in C# (and coming from C++) I found myself running into type casts that seemed like they should have worked. C++ is just a bit more liberal when it comes to this sort of thing, so in C# the designers wanted you to know when your type conversion were ambiguous or ill-advised. The Convert type then fills in the gaps by allowing you to explicitly convert and understand the side-effects.
我知道当开始使用 C#(并且来自 C++)时,我发现自己遇到了看起来应该可以工作的类型转换。C++ 在处理这类事情时更加自由一些,因此在 C# 中,设计人员希望您知道您的类型转换何时模棱两可或不明智。然后 Convert 类型通过允许您显式转换和理解副作用来填补空白。
回答by Jimbo
VB .net is perfectly capable of casting from an int to string... in fact so is Java. Why should C# have a problem with it? Sometimes it is necessary to use a number value in calculations and then display the result in a string format. How else would you manage to display the result of a calculation in a TextBox?
VB .net 完全有能力将 int 转换为 string ……事实上 Java 也是如此。为什么 C# 会有问题?有时需要在计算中使用数字值,然后以字符串格式显示结果。您还能如何设法在 TextBox 中显示计算结果?
The responses given here make no sense. There must be a way to cast an int as a string.
这里给出的回答毫无意义。必须有一种方法可以将 int 转换为字符串。
回答by Jimbo
I just found the answer. ToString works fine on an int variable. You just have to make sure you add the brackets.
我刚刚找到了答案。ToString 在 int 变量上工作正常。您只需要确保添加括号。
ie...
IE...
int intMyInt=32;
string strMyString = intMyInt.ToString();