2009-08-27 59 views
11

什么是类型转换,这有什么用?它是如何工作的?在C中进行类型转换#

请提供样例教程,我找不到任何搜索Google的好程序。

+2

哈哈哈..真是个笑话!!! – MAC

+0

我可以告诉你知道如何制定你的问题,亲爱的! –

+0

[http://en.wikipedia.org/wiki/Type_conversion](http://en.wikipedia.org/wiki/Type_conversion) – Raghav

回答

50

铸造通常是告诉,虽然它只是知道一个值是一些通用型的编译器的问题,你知道这是实际上是一个更具体的类型的。例如:

object x = "hello"; 

... 

// I know that x really refers to a string 
string y = (string) x; 

有各种转换运算符。所述(typename) expression形式可以做三件不同的事情:

  • 取消装箱转换(例如,从一个装箱整数int
  • 用户定义的转换(例如,铸造XAttributestring)内的
  • 引用转换类型的层次结构(例如铸造objectstring

所有这些可能会失败在执行时,在这种情况下,将引发异常。

as操作者,另一方面,从不抛出异常 - 相反,该转换的结果是null如果失败:

object x = new object(); 
string y = x as string; // Now y is null because x isn't a string 

它可用于解包到一个空值类型:

object x = 10; // Boxed int 
float? y = x as float?; // Now y has a null value because x isn't a boxed float 

也存在隐式转换,例如从intlong

int x = 10; 
long y = x; // Implicit conversion 

这是否涵盖一切你感兴趣的?

+1

好的答案乔恩! – UnkwnTech

+2

@jon Skeet给出了答案,它并没有涵盖它发生过的所有事情? – Shrivallabh

+0

阅读[this](http://stackoverflow.com/questions/2690866/what-is-the-purpose-of-a-question-mark-after-a-type-for-example-int-myvariabl)看到'float'类型后问号的作用。 – martijnn2008

2

参见thisthis

由于C#是在编译时静态类型,一个变量声明之后,它不能被再次声明或用于另一种类型的存储的值,除非该类型可转换为变量的类型

...

然而,你可能有时需要的值复制到另一种类型的变量或方法参数。例如,您可能有一个整型变量,您需要将其传递给参数类型为double的方法。或者您可能需要将类变量分配给接口类型的变量。这些类型的操作称为类型转换。在C#中,您可以执行以下种类的转换

+0

来自链接:“但是,如果转换不能没有失去的风险信息,编译器要求您执行显式转换,这称为转换。“ 这是说铸造是一样的显式转换? –

0

将数据从一种数据类型转换为另一种数据类型。

一般阅读请参阅this

又见msdn

3

投射意味着创建一个对象的引用,该引用与您当前拥有的引用类型不同。你可以做向上转换或向下转换,每个都有不同的好处。

上溯造型:

string greeting = "Hi Bob"; 
object o = greeting; 

这产生从更具体的参考(字符串)的更一般的参考(对象)。也许你写的代码,可以处理任何对象,像这样:

Console.WriteLine("Type of o is " + o.GetType()); 

这些代码并不需要无论什么对象设置o设置为改变。

向下转换:

object o = "Hi Bob"; 
string greeting = (string)o; 

在这里,你想更具体的参考。你可能知道,对象是一个字符串(您可以测试这个例如:

if (o is string) 
{ do something } 

现在你可以把参考的字符串,而不是一个对象如字符串的长度(但对象不),这样你就可以说:

Console.WriteLine("Length of string is " + greeting.length); 

,你不能用一个对象做

0

另外,如果你明确铸造,可以利用模式匹配的。如果你有一个对象。 :

object aObject = "My string value"; 

你可以安全地把对象作为一个单行的字符串:

if (aObject is string aString) 
{ 
    Console.WriteLine("aString = " + aString) 
    // Output: "aString = My string value" 
} 

用倒置if语句,你可以放心地投类型,未能早早如果需要使用此,沿

public void Conversion(object objA, object objB) 
{ 
    // Fail out early if the objects provided are not the correct type, or are null 
    if (!(objA is string str) || !(objB is int num)) { return; } 

    // Now, you have `str` and `num` that are safely cast, non-null variables 
    // all while maintaining the same scope as your Conversion method 
    Console.WriteLine("str.Length is " + str.Length); 
    Console.WriteLine("num is " + num); 
}