C#類型轉換

參考轉載: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 運算符,使你可以在實際執行強制轉換之前測試兼容性。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容