【问题标题】:Typecasting in C#C# 中的类型转换
【发布时间】:2010-11-23 07:02:46
【问题描述】:

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

【问题讨论】:

标签: c#


【解决方案1】:

此外,如果您要显式转换,则可以利用模式匹配。如果你有一个对象:

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);
}

【讨论】:

    【解决方案2】:

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

    向上转型:

    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);
    

    你不能用一个对象来做。

    【讨论】:

      【解决方案3】:

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

      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
      

      这是否涵盖了您感兴趣的所有内容?

      【讨论】:

      • @jon Skeet 给出了答案,但它并没有涵盖它曾经发生的一切?
      • 阅读this 以查看float 类型之后的问号的作用。
      【解决方案4】:

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

      有关一般阅读,请参阅this

      另见msdn

      【讨论】:

        【解决方案5】:

        thisthis

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

        ...

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

        【讨论】:

        • 来自链接:“但是,如果无法在没有丢失信息的风险的情况下进行转换,编译器会要求您执行显式转换,这称为强制转换。”是不是说强制转换和显式转换是一样的?
        猜你喜欢
        • 2020-11-17
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 2022-08-27
        • 2012-02-23
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多