类型铸造在c#.net

问题描述:

我想知道在c#.net中的类型转换,我有下面的代码行。类型铸造在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)工作和最新的差异。

说到装箱和拆箱,类型有明确和隐含的转换。因此,在某些情况下,运行时很容易允许两种支持类型之间的隐式转换,例如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的类型)转换为另一个的支持。因此,ToStringConvert.ToString将是首选方法(ToString和Convert.ToString实际上是同义词,但ToString为您提供了一些格式选项)。

ToString()方法被对象类中的每一个参考替代,这是虚拟方法。字符串calss覆盖该方法并提供字符串值。

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

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

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

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

那么,stringobject - 它们都是参考类型。但是,object是所有.NET类型的根类型。

当您使用(string)i等语法时,您试图使用显式转换类型。但是这种转换类型需要string类来了解所有可能的参数类型。

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

字符串s = i和字符串s =(字符串)1不工作

因为我不是字符串,和类型转换为所述类型的CAST,不进行转换。它只适用于我包含字符串或字符串的子类(这不可能用于字符串,但可能用于其他类)。

使用(string)i,i.ToString()和Convert.ToString(i)的区别是什么。

  • (字符串)1:铸i到一个字符串,必须是可分配的。 i.ToString():调用ToSstring方法,该方法在System.object上是defiend,因此可用于所有类和结构 - 但如果不覆盖,则不会返回任何合理的内容。

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

最后,铸造不是共同的。为(字符串)我工作我必须是一个字符串,而转换尝试使它成为一个字符串。

+0

“类型CASTING是类型的CAST,而不是转换。它只适用于包含字符串或字符串子类的情况。” - 它可以是转换,如果定义了一个? – Rawling 2012-02-27 10:06:22

+0

如果定义了隐式转换,它可以是一个。不知道这也适用于拆箱 - 但它必须通过运营商超载作为转换。 – TomTom 2012-02-27 10:07:36

+0

所以它的意思是,string(i)和i.ToString()是相同的,它会尝试转换类型,对吧? – Abbas 2012-02-27 10:11:03

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

看到这个MSDN article上铸造如需进一步信息

+0

但如何反对o =我成功,即使这里o不是int,仍然不需要类型转换 – Abbas 2012-02-27 10:05:56

+0

@Abbas,因为我是一个对象。 – 2012-02-27 10:29:17

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

string s=(string)i不起作用,因为它不能asume哪种类型的转换将被使用(即,其基)

s = ""+i另一方面会工作,因为这将asume基座10的转换。

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

简短的答案是,有没有隐式的(上述第一个例子),也没有明确的(第二上面的例子)投从int到字符串定义。稍微长一点的答案;在C#编写的结构Int32当没有铸造行为进行编程,使开发人员能够自动地从一个int转换为字符串

什么使用(string)ii.ToString()的差异,Convert.ToString(i)

好,第一个不像你说的那样工作,正如上面解释的那样。第二个调用结构Int32上的ToString方法,该方法返回(顾名思义)该对象的字符串表示形式。应该指出,这是一个全新的字符串,与原始值没有任何关系。第三个示例Convert.ToString将在引擎盖下调用任何将参数传递给字符串的最合适方式 - 很可能只是调用ToString方法 - 与例2非常相似。

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

将int对象转换为使用Int32。

将对象的投射字符串使用字符串。

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

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

C#中的类型转换只能沿着类继承的方式工作。对象是C#中所有类型的根,因此所有值都可以对它进行类型转换。

stringint不共享相同的继承分支,因此不能从一个直接投向另一个。

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

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

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