类型铸造在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
的类型)转换为另一个的支持。因此,ToString
或Convert.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方法的引用类型继承。
那么,string
和object
- 它们都是参考类型。但是,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的转换器。
最后,铸造不是共同的。为(字符串)我工作我必须是一个字符串,而转换尝试使它成为一个字符串。
您可以在.net中指定隐式和显式转换,字符串s = i失败的原因是没有为整数转换为字符串的内置转换操作。
看到这个MSDN article上铸造如需进一步信息
但如何反对o =我成功,即使这里o不是int,仍然不需要类型转换 – Abbas 2012-02-27 10:05:56
@Abbas,因为我是一个对象。 – 2012-02-27 10:29:17
string s= i
不起作用,因为该类型不匹配,INT不会进入一个字符串。
string s=(string)i
不起作用,因为它不能asume哪种类型的转换将被使用(即,其基)
像s = ""+i
另一方面会工作,因为这将asume基座10的转换。
,所以我想知道为什么
string s = i
和string s = (string)i
不起作用
简短的答案是,有没有隐式的(上述第一个例子),也没有明确的(第二上面的例子)投从int到字符串定义。稍微长一点的答案;在C#编写的结构Int32
当没有铸造行为进行编程,使开发人员能够自动地从一个int转换为字符串
什么使用
(string)i
,i.ToString()
的差异,Convert.ToString(i)
好,第一个不像你说的那样工作,正如上面解释的那样。第二个调用结构Int32
上的ToString
方法,该方法返回(顾名思义)该对象的字符串表示形式。应该指出,这是一个全新的字符串,与原始值没有任何关系。第三个示例Convert.ToString
将在引擎盖下调用任何将参数传递给字符串的最合适方式 - 很可能只是调用ToString
方法 - 与例2非常相似。
首先要注意的是每个类都是从对象派生的。
将int对象转换为使用Int32。
将对象的投射字符串使用字符串。
不存在从整数到字符串的隐式转换,因为它们位于类层次结构的不同部分中 - 其中一个与另一个不相关。但是,因为字符串经常用于输出对象(因此它的所有子节点),所以为了方便起见,有一个ToString()方法。
但是Convert是为了能够从一种类型转换为另一种类型而编写的,例如Convert.ToBool(x)可以将“true”或“false”解析为布尔值,并且如您所示,它可以将一个整数到一个字符串 - 这再次是真正的方便,可能只是调用Int32.ToString()。
C#中的类型转换只能沿着类继承的方式工作。对象是C#中所有类型的根,因此所有值都可以对它进行类型转换。
string
和int
不共享相同的继承分支,因此不能从一个直接投向另一个。
Convert.ToString()
是一种将整数转换为字符串的方法 - 没有类型转换,它只是执行一个将整数转换为字符串表示的方法。
i.ToString()
执行与Convert.ToString()
等效的功能,但i.ToString()
具有重载,这些重载允许以字符串格式表示数字的更大灵活性。
最后一个注释,类型转换规则的例外可以由开发人员通过使用public static explicit operator
方法来包含,该方法允许开发人员在他们认为合适时将一个值转换为另一个值。
“类型CASTING是类型的CAST,而不是转换。它只适用于包含字符串或字符串子类的情况。” - 它可以是转换,如果定义了一个? – Rawling 2012-02-27 10:06:22
如果定义了隐式转换,它可以是一个。不知道这也适用于拆箱 - 但它必须通过运营商超载作为转换。 – TomTom 2012-02-27 10:07:36
所以它的意思是,string(i)和i.ToString()是相同的,它会尝试转换类型,对吧? – Abbas 2012-02-27 10:11:03