1

我想知道 c# .net 中的类型转换,我有以下代码行。

int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.

所以我想知道为什么string s = i and string s = (string)i不起作用以及使用有什么区别(string)i, i.ToString(), and Convert.ToString(i)

4

9 回答 9

3

在装箱和拆箱方面,类型具有显式和隐式强制转换。因此,在某些情况下,运行时很容易允许在两种支持的类型之间进行隐式转换,例如从 Int32 到 Double。但是,整数和字符串之间没有隐式或显式转换,因为很明显,字符串不是整数(尽管字符串可以包含整数的字符)。

string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion

那就是Convert玩的地方。Convert包含对尝试将已知原语(和支持的类型IConvertable)转换为另一个的支持。因此,ToString或者Convert.ToString将是首选方法(ToString 和 Convert.ToString 实际上是同义词,除了 ToString 为您提供了一些格式化选项)。

于 2012-02-27T10:06:20.380 回答
0

string s= i不起作用,因为类型不匹配,int 不会进入字符串。

string s=(string)i不起作用,因为它无法假定要使用哪种类型转换(即哪个基数)

s = ""+i另一方面,类似的 东西会起作用,因为它会假设基数为 10 转换。

于 2012-02-27T10:05:02.937 回答
0

所以我想知道为什么string s = i并且string s = (string)i不起作用

简短的回答是,没有从 int 到定义的字符串的隐式(上面的第一个示例)或显式(上面的第二个示例)强制转换。答案稍长;在 C# 中创作结构时Int32,没有编程任何转换行为以使开发人员能够自动从 int 转换为字符串

(string)i使用,i.ToString()和有什么区别Convert.ToString(i)

好吧,第一个不起作用;正如你所说,正如我在上面解释的那样。第二个调用ToStringstruct 上的方法,该方法Int32返回(顾名思义)对象的字符串表示形式。需要注意的是,这是一个全新的字符串,与原始值没有任何关系。第三个示例Convert.ToString将在后台调用任何最合适的方法来将传入的参数转换为字符串 - 很可能只是调用该ToString方法 - 与示例 2 几乎相同。

于 2012-02-27T10:05:48.803 回答
0

ToString()方法被每个引用覆盖,这是对象类中的重要方法。string calss 覆盖该方法并从中提供字符串值。

ToString 方法的默认实现返回 Object 类型的完全限定名称,如以下示例所示。

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object

此行为由不覆盖 ToString 方法的引用类型继承。

于 2012-02-27T10:00:11.880 回答
0

首先要注意的是每个类都派生自对象。

将 int 转换为对象是使用 Int32。

将字符串转换为对象是使用字符串。

没有从整数到字符串的隐式转换,因为它们位于类层次结构的不同部分——其中一个与另一个没有任何关系。但是,由于字符串经常用于输出对象(以及因此它的所有子对象),因此为了方便起见,有一个 ToString() 方法。

但是 Convert 是专门为能够从一种类型转换为另一种类型而编写的,例如 Convert.ToBool(x) 可以将“true”或“false”解析为布尔值,并且正如您所展示的,它可以将整数转换为字符串 -再次,这真的很方便,可能只是在后台调用 Int32.ToString() 。

于 2012-02-27T10:08:59.617 回答
0

C# 中的类型转换仅适用于类继承。Object 是 C# 中所有类型的根,因此所有值都可以类型转换为它。

string并且int不共享相同的继承分支,因此不能直接从一个转移到另一个。

Convert.ToString()是一种旨在将整数转换为字符串的方法 - 没有进行类型转换,它只是执行旨在将整数转换为字符串表示的方法。

i.ToString()执行与 等效的功能Convert.ToString(),但i.ToString()具有重载允许以字符串格式表示数字时具有更大的灵活性。

最后一点,开发人员可以通过使用public static explicit operator允许开发人员将一个值转换为他们认为合适的另一个值的方法来包含类型转换规则的例外。

于 2012-02-27T10:10:10.957 回答
0

好吧,string而且object- 它们都是引用类型。但是,object它是所有 .NET 类型的根类型。

当您使用这样的语法时(string)i,您正在尝试使用类型之间的显式转换。但是这种转换类型需要string类知道所有可能的参数类型。

所以我们有了.ToString()方法,它可以在任何类中被覆盖,它的返回值被用作任何对象的字符串表示。

于 2012-02-27T10:03:24.813 回答
0

字符串 s = i 和字符串 s = (string)i 不起作用

因为 I 不是字符串,而类型 CASTING 是类型的 CAST,而不是转换。它仅在 i 包含字符串或字符串的子类时才有效(这对于字符串是不可能的,但可能对于其他类)。

使用 (string)i、i.ToString() 和 Convert.ToString(i) 有什么区别。

  • (string) i: 将 i 转换为字符串,必须是可赋值的。

  • i.ToString():调用 ToSstring 方法,该方法在 System.object 上被定义,因此可用于所有类和结构 - 但如果不被覆盖,则不会返回任何有意义的内容。

  • Convert.ToString(i):将 i 转换为字符串。这包括调用一个转换器,在这种罕见的情况下可能只调用 ToString。

最后,铸造不是转换。for (string) i to work i HAS TO BE A STRING,而 convert 试图使其成为字符串。

于 2012-02-27T10:03:49.680 回答
0

您可以在 .net 中指定隐式和显式转换,字符串 s = i 失败的原因是没有内置的将整数转换为字符串的转换操作。

有关更多信息,请参阅此MSDN 文章

于 2012-02-27T10:03:53.963 回答