在C#中进行类型转换

时间:2009-08-27 07:46:52

标签: c#

什么是类型转换,这有什么用?它是如何工作的?

请提供示例教程,我找不到任何搜索Google的好文章。

5 个答案:

答案 0 :(得分:62)

转换通常是告诉编译器虽然它只知道某个值是某种通用类型,但您知道它的实际上是更具体的类型。例如:

object x = "hello";

...

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

有各种转换运算符。 (typename) expression表单可以执行三种不同的操作:

  • 取消装箱转化(例如从盒装整数到int
  • 用户定义的转化(例如,将XAttribute转换为string
  • 类型层次结构中的引用转换(例如,将object转换为string

所有这些都可能在执行时失败,在这种情况下会抛出异常。

另一方面,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 :(得分:4)

强制转换意味着创建对与您当前持有的引用类型不同的对象的引用。你可以进行向上转换或向下转换,每个都有不同的好处。

向上转型:

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

这将从更具体的引用(字符串)创建更通用的引用(对象)。也许你已经编写了可以处理任何对象的代码,例如:

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

无论你设置什么对象,都不需要更改代码。

向下转换:

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

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

if (o is string)
{ do something }

现在,您可以将引用视为字符串而不是对象。例如。一个字符串有一个长度(但一个对象没有),所以你可以说:

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

你不能用对象做什么。

答案 2 :(得分:2)

请参阅thisthis

  

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

     

...

     

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

答案 3 :(得分:0)

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

如需一般性阅读,请参阅this

另见msdn

答案 4 :(得分:0)

此外,如果您要明确投射,则可以利用模式匹配。如果你有一个对象:

object aObject = "My string value";

您可以安全地将对象转换为一行中的字符串:

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

使用它,以及if 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);
}