美文网首页
C#类型转换

C#类型转换

作者: 86a262e62b0b | 来源:发表于2019-08-29 15:58 被阅读0次

参考转载:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/casting-and-type-conversions

原因:由于 C# 是在编译时静态类型化的,因此变量在声明后就无法再次声明,或无法分配另一种类型的值,除非该类型可以转换。

在 C# 中,可以执行以下几种类型的转换:

  • 隐式转换:由于这种转换是类型安全且不会导致数据丢失,因此无需使用任何特殊语法。 示例包括从较小整数类型到较大整数类型的转换以及从派生类到基类的转换。
  • 显式转换(强制转换) :必须使用强制转换运算符,才能执行显式转换。 在转换中可能丢失信息时或在出于其他原因转换可能不成功时,必须进行强制转换。 典型的示例包括从数值到精度较低或范围较小的类型的转换和从基类实例到派生类的转换。
  • 用户定义的转换:用户定义的转换是使用特殊方法执行,这些方法可定义为在没有基类和派生类关系的自定义类型之间启用显式转换和隐式转换。 有关详细信息,请参阅用户定义转换运算符
  • 使用帮助程序类进行转换:若要在非兼容类型(如整数和 System.DateTime 对象,或十六进制字符串和字节数组)之间转换,可使用 System.BitConverter 类、System.Convert 类和内置数值类型的 Parse 方法(如 Int32.Parse)。 有关详细信息,请参阅如何:将字节数组转换为 int操作说明:将字符串转换为数字操作说明:在十六进制字符串与数值类型之间转换

一. 显示转换

1. 使用原因

如果进行转换可能会导致信息丢失,则编译器会要求执行显式转换,显式转换也称为强制转换。 强制转换是显式告知编译器你打算进行转换且你知道可能会发生数据丢失的一种方式。 若要执行强制转换,请在要转换的值或变量前面的括号中指定要强制转换到的类型。

下面的程序将 double 强制转换为 int。如不强制转换则该程序不会进行编译。

class Test
{
    static void Main()
    {
        double x = 1234.7;
        int a;
        // Cast double to int.
        a = (int)x;
        System.Console.WriteLine(a);
    }
}
// Output: 1234

2. 关于引用类型:

如果需要从基类型转换为派生类型,则必须进行显式强制转换:

  • 重点:引用类型之间的强制转换操作不会更改基础对象的运行时类型;它只更改用作对该对象引用的值的类型。这也解释了下面抛出异常的情况。有关详细信息,请参阅多态性
// Create a new derived type.  
Giraffe g = new Giraffe();  
  
// Implicit conversion to base type is safe.  
Animal a = g;  
  
// Explicit conversion is required to cast back  
// to derived type. Note: This will compile but will  
// throw an exception at run time if the right-side  
// object is not in fact a Giraffe.  
Giraffe g2 = (Giraffe) a;  

3. 关于异常

  • 在某些引用类型转换中,编译器无法确定强制转换是否会有效。 正确进行编译的强制转换操作有可能在运行时失败。 如下面的示例所示,类型转换在运行时失败将导致引发 InvalidCastException
using System;

class Animal
{
    public void Eat() { Console.WriteLine("Eating."); }
    public override string ToString()
    {
        return "I am an animal.";
    }
}
class Reptile : Animal { }
class Mammal : Animal { }

class UnSafeCast
{
    static void Main()
    {            
        Test(new Mammal());

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }

    static void Test(Animal a)
    {
        // Cause InvalidCastException at run time 
        // because Mammal is not convertible to Reptile.
        Reptile r = (Reptile)a;
    }
}

当然,C# 提供 is 运算符,使你可以在实际执行强制转换之前测试兼容性。

相关文章

  • c# 学习笔记2

    C# 类型转换类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种...

  • C# Byte[]使用总结

    C# Byte[] string转换 01,C# string类型转成byte[]: Byte[] byteArr...

  • C#魔灵-lesson_04-数据转换

    类型转换分以下两种 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。 显式类型...

  • unity C# 自定义隐式转换

    在C#中类型转换类型:隐式转换(implicit conversions)隐式转换就是系统默认的、不需要加以声明就...

  • c# is & as

    做为C#里的类型转换操作符,is和as都是强制类型转换。 Difference is 类型检查,检查一个对象是否兼...

  • Python、JS、TS、C# 对比

    手头暂时没有C# 环境,以后会补全 内容\语言PythonJSTSC#强/弱类型强类型不可动态转换弱类型可动态转换...

  • C# 类型转换

    隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的...

  • 07.【转】C#中的as用法 &【原创】Revit中的转

    【转载内容】在程序中,进行类型转换是常见的事,C#支持基本的强制类型转换方法,例如: 这样强制转换的时候,这个过程...

  • C#的值类型和引用类型

    c#中值类型和引用类型是可以相互转换的。将值类型转化为引用类型的过程称为装箱,反之,将引用类型转换为值类型的过程称...

  • 10.18学习总结

    今天学习完了c#语言基础,包括类型转换(Parse和To string),装箱与拆箱(值类型和引用类型) ,...

网友评论

      本文标题:C#类型转换

      本文链接:https://www.haomeiwen.com/subject/ctmiectx.html